potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

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"