potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

R purrrパッケージ(tidyverse)のmapメモ

変数の数 使う変数 リスト integerベクトル doubleベクトル characterベクトル logicalベクトル raw データフレーム 無視(元の値)
1個 . .x ..1 map map_int map_dbl map_chr map_lgl map_raw map_dfc, map_dfr walk
2個 . .x .y ..1 ..2 map2 map2_dbl map2_dbl map2_chr map2_lgl map2_raw map2_dfc, map_dfr walk2
1個以上 . .x .y ..1 ..2 ..3 ..N pmap pmap_dbl pmap_dbl pmap_chr pmap_lgl pmap_raw pmap_dfc, map_dfr pwalk
1個+インデックス . .x .y ..1 ..2 imap imap_dbl imap_dbl imap_chr imap_lgl imap_raw imap_dfc, map_dfr iwalk

map系関数

require(purrr)

# 各要素に関数を適用した結果をリストで返す。
1:5 %>% map(~.+2) # list(3, 4, 5, 6, 7)

# 各要素に関数を適用した結果を対応する型の1次元ベクトルで返す。
1:5 %>% map_dbl(~.+2)  # [3, 4, 5, 6, 7]
1:5 %>% map_int(~.+2L) # [3, 4, 5, 6, 7]
1:5 %>% map_chr(~.+2)  # ["3.000000", "4.000000", "5.000000", "6.000000", "7.000000"]
1:5 %>% map_lgl(~.>2)  # [FALSE, FALSE, TRUE, TRUE, TRUE]

# 各要素に関数を適用した結果をraw型で返す。
1:5 %>% map_raw(~as.raw(.+2)) # raw(5): [03, 04, 05, 06, 07]

# 各要素に関数を適用した結果をデータフレームで返す。
1:5 %>% map_dfc(~set_names(data.frame(rep(., 5)), paste0("Col.", .)))
#  Col.1 Col.2 Col.3 Col.4 Col.5
#1     1     2     3     4     5
#2     1     2     3     4     5
#3     1     2     3     4     5
#4     1     2     3     4     5
#5     1     2     3     4     5

1:5 %>% map_dfr(~data.frame(a=., b=.+2))
#  a b
#1 1 3
#2 2 4
#3 3 5
#4 4 6
#5 5 7

# 最初の引数に名前をつけると項目や要素の名前に反映されます。
set_names(1:5, letters[1:5]) %>% map(~.+2) # list(a=3, b=4, c=5, d=6, e=7)

# 各要素に関数を適用する。戻り値は与えられたデータ。
1:5 %>% walk(~print(.))
#1
#2
#3
#4
#5

(1:5 %>% walk(~print(.))) # 1:5
#1
#2
#3
#4
#5

imap系関数

require(purrr)

# 各要素に関数を適用した結果をリストで返す。
# .x or ..1に要素、.y or ..2に要素の名前が与えられる。
1:5 %>% imap(~paste0(.x+2, "-", .y))
#list("3-1", "4-2", "5-3", "6-4", "7-5")
1:5 %>% imap(~paste0(..1+2, "-", ..2))
#list("3-1", "4-2", "5-3", "6-4", "7-5")
set_names(1:5, LETTERS[1:5]) %>% imap(~paste0(.x+2, "-", .y))
#list(A="3-A", B="4-B", C="5-C", D="6-D", E="7-E")

# 各要素に関数を適用した結果を対応する型の1次元ベクトルで返す。
# .x or ..1に要素、.y or ..2に要素の名前が与えられる。
1:5 %>% imap_dbl(~.x+.y)     # [1+1, 2+2, 3+3, 4+4, 5+5]
1:5 %>% imap_int(~.x+.y)     # [1+1, 2+2, 3+3, 4+4, 5+5]
1:5 %>% imap_chr(~.x+.y)     # ["2", "4", "6", "8", "10"]
1:5 %>% imap_lgl(~.x+.y > 5) # [FALSE, FALSE, TRUE, TRUE, TRUE]

# 各要素に関数を適用した結果をraw型で返す。
1:5 %>% imap_raw(~as.raw(.x+.y)) # raw(5): [02, 04, 06, 08, 0a]

# 各要素に関数を適用した結果をデータフレームで返す。
set_names(1:5, LETTERS[1:5]) %>% imap_dfc(~set_names(data.frame(rep(., 5)), sprintf("Col%s", .y)))
#  ColA ColB ColC ColD ColE
#1    1    2    3    4    5
#2    1    2    3    4    5
#3    1    2    3    4    5
#4    1    2    3    4    5
#5    1    2    3    4    5

set_names(1:5, LETTERS[1:5]) %>% imap_dfr(~data.frame(a=.x, b=.y))
#  a b
#1 1 A
#2 2 B
#3 3 C
#4 4 D
#5 5 E

# 各要素に関数を適用する。戻り値は与えられたデータ。
1:5 %>% iwalk(~print(.x+.y))
#2
#4
#6
#8
#10

(1:5 %>% iwalk(~print(.x+.y))) # 1:5
#2
#4
#6
#8
#10

map2系関数

require(purrr)

map2(1:5, 11:15, -.x+.y)
# list(12, 14, 16, 18, 20)

map2_dbl(1:5, 11:15, ~.x+.y)
# [12, 14, 16, 18, 20]
map2_int(1:5, 11:15, ~.x+.y)
# [12, 14, 16, 18, 20]
map2_chr(1:5, 11:15, ~.x+.y)
# ["12", "14", "16", "18", "20"]
map2_lgl(1:5, 11:15, ~.x+.y>15)
# [FALSE, FALSE, TRUE, TRUE, TRUE]
map2_raw(1:5, 11:15, ~as.raw(.x+.y))
# raw(5) [0c, 0e, 10, 12, 14]
map2_dfr(1:5, LETTERS[1:5], ~data.frame(A=.x, B=.y))
#  A B
#1 1 A
#2 2 B
#3 3 C
#4 4 D
#5 5 E
map2_dfc(1:5, LETTERS[1:5], ~set_names(data.frame(rep(.x, 5)), .y))
#  A B C D E
#1 1 2 3 4 5
#2 1 2 3 4 5
#3 1 2 3 4 5
#4 1 2 3 4 5
#5 1 2 3 4 5

# 最初の引数xに名前をつけるとリストや配列に反映されます。
map2(set_names(1:5, letters[1:5]), set_names(11:15, LETTERS[1:5]), ~.x+.y)
# list(a=12, b=14, c=16, d=18, e=20)

map2_dbl(set_names(1:5, LETTERS[1:5]), 11:15, ~.x+.y)
#   A   B   C   D   E
# [12, 14, 16, 18, 20]

# 各要素に関数を適用する。戻り値は与えられたデータ。
walk2(1:5, LETTERS[1:5], ~print(paste0(.x, "-", .y)))
# "1-A"
# "2-B"
# "3-C"
# "4-D"
# "5-E"