R中map()与map_dfr()的区别

7
在使用Tidyverse中的purrr包时,我注意到map()函数返回一个列表。
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()函数在映射函数中直接绑定行?


尝试使用t(mapply(rnorm, 3, 1:5)) - jay.sf
map_dfr答案的一个最近的例子 - https://stackoverflow.com/q/66480541/10276092 - M.Viking
2个回答

10

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 

2
有趣的是,如果您提供了一个命名输入并返回一个向量,map_dfr将绑定列:set_names(3:5) %>% map_dfr(~1:3) - starja

0

使用map_dfr的另一种方法。我喜欢这样使用它,因为它允许在OP问题范围之外进行其他可能性。

library(tidyverse)

df <- map_dfr(1:5, function(x) {
       r <- rnorm(3)
       tibble(A = r[1], B = r[2], C = r[3])
})

2
答案没有揭示map_dfr和map函数之间的区别。请尝试突出使用情况、性能问题或任何在上面的答案中未描述的方面。 - codez0mb1e

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接