R 中的差异 map() 与 map_dfr()
Difference map() vs. map_dfr() in R
在 R
中使用 Tidyverse 的 purrr
包时,我看到 map()
函数 returns 一个列表。
library(tidyverse)
set.seed(123)
map(1:5, ~rnorm(3))
#> [[1]]
#> [1] -0.5604756 -0.2301775 1.5587083
#>
#> [[2]]
#> [1] 0.07050839 0.12928774 1.71506499
#>
#> [[3]]
#> [1] 0.4609162 -1.2650612 -0.6868529
#> ......
我想将此列表转换为包含 3 列的数据框。一种选择是使用 do.call(rbind, .)
。但是,我也注意到 map_dfr()
函数存在。
以与 map()
相同的方式使用此函数会出错。
map_dfr(1:5, ~rnorm(3))
#> Error: Argument 1 must have names.
问题
导致此错误的 map()
和 map_dfr()
函数有何区别?以及在映射函数中应该如何使用map_dfr()
函数直接绑定行?
map_dfr
当map
输出是数据帧或命名向量时直接绑定行:
library(dplyr)
library(purrr)
map(1:5, ~as.data.frame(matrix(rnorm(3),nrow=1)))
[[1]]
V1 V2 V3
1 1.326029 0.4581257 0.4367454
[[2]]
V1 V2 V3
1 -0.3769822 -0.2488601 -1.441538
[[3]]
V1 V2 V3
1 -0.4931225 1.145818 -0.6269974
[[4]]
V1 V2 V3
1 -1.679398 1.035032 1.784175
[[5]]
V1 V2 V3
1 0.5158901 -2.322314 -1.145897
map_dfr(1:5, ~as.data.frame(matrix(rnorm(3),nrow=1)))
V1 V2 V3
1 0.29250530 -0.8325543 0.21013608
2 1.03348415 0.3333718 -0.08498664
3 1.01011329 0.6583516 -0.49360421
4 -0.06229409 -0.1200969 0.06078136
5 -1.92491929 0.3891900 -0.57046411
相当于:
map(1:5, ~as.data.frame(matrix(rnorm(3),nrow=1))) %>% bind_rows
您收到错误消息是因为您向 map_dfr
提供了一个没有列名的向量。
这有效:
map_dfr(1:5, ~setNames(rnorm(3),LETTERS[1:3]))
# A tibble: 5 x 3
A B C
<dbl> <dbl> <dbl>
1 -0.360 -1.36 1.40
2 0.715 1.55 0.381
3 1.20 -0.179 0.315
4 0.126 -0.467 1.04
5 1.31 0.375 -2.21
在 R
中使用 Tidyverse 的 purrr
包时,我看到 map()
函数 returns 一个列表。
library(tidyverse)
set.seed(123)
map(1:5, ~rnorm(3))
#> [[1]]
#> [1] -0.5604756 -0.2301775 1.5587083
#>
#> [[2]]
#> [1] 0.07050839 0.12928774 1.71506499
#>
#> [[3]]
#> [1] 0.4609162 -1.2650612 -0.6868529
#> ......
我想将此列表转换为包含 3 列的数据框。一种选择是使用 do.call(rbind, .)
。但是,我也注意到 map_dfr()
函数存在。
以与 map()
相同的方式使用此函数会出错。
map_dfr(1:5, ~rnorm(3))
#> Error: Argument 1 must have names.
问题
导致此错误的 map()
和 map_dfr()
函数有何区别?以及在映射函数中应该如何使用map_dfr()
函数直接绑定行?
map_dfr
当map
输出是数据帧或命名向量时直接绑定行:
library(dplyr)
library(purrr)
map(1:5, ~as.data.frame(matrix(rnorm(3),nrow=1)))
[[1]]
V1 V2 V3
1 1.326029 0.4581257 0.4367454
[[2]]
V1 V2 V3
1 -0.3769822 -0.2488601 -1.441538
[[3]]
V1 V2 V3
1 -0.4931225 1.145818 -0.6269974
[[4]]
V1 V2 V3
1 -1.679398 1.035032 1.784175
[[5]]
V1 V2 V3
1 0.5158901 -2.322314 -1.145897
map_dfr(1:5, ~as.data.frame(matrix(rnorm(3),nrow=1)))
V1 V2 V3
1 0.29250530 -0.8325543 0.21013608
2 1.03348415 0.3333718 -0.08498664
3 1.01011329 0.6583516 -0.49360421
4 -0.06229409 -0.1200969 0.06078136
5 -1.92491929 0.3891900 -0.57046411
相当于:
map(1:5, ~as.data.frame(matrix(rnorm(3),nrow=1))) %>% bind_rows
您收到错误消息是因为您向 map_dfr
提供了一个没有列名的向量。
这有效:
map_dfr(1:5, ~setNames(rnorm(3),LETTERS[1:3]))
# A tibble: 5 x 3
A B C
<dbl> <dbl> <dbl>
1 -0.360 -1.36 1.40
2 0.715 1.55 0.381
3 1.20 -0.179 0.315
4 0.126 -0.467 1.04
5 1.31 0.375 -2.21