purrr :: map_df与嵌套的data.frame

时间:2018-05-01 14:55:20

标签: r tidyr purrr

我希望迭代一系列数据帧并将相同的功能应用于所有数据帧。

我正在使用tidyr::nestpurrr::map_df尝试此操作。这是我试图实现的那种事情的代表。

data(iris)
library(purrr)
library(tidyr)

iris_df <- as.data.frame(iris)
my_var <- 2

my_fun <- function(df) {
  sum_df <- sum(df) + my_var
}

iris_df %>% group_by(Species) %>% nest() %>% map_df(.$data, my_fun)
# Error: Index 1 must have length 1

我做错了什么?有不同的方法吗?

编辑: 澄清我想要的输出。针对包含输出的新列,例如

|Species|Data|my_function_output|
|:------|:---|:-----------------|
|setosa |<tibble>|509.1         |

1 个答案:

答案 0 :(得分:2)

问题是nest()为您提供了一个data.frame,其中包含一列data {frame}列data。您需要在map输出的sapply列上datanest(),而不是整个nest输出。我使用sapply,但您也可以使用map_dbl。如果您使用map,则最终会输出list,而map_df将无效,因为它需要命名输入。

iris_df %>% 
  group_by(Species) %>% 
  nest() %>% 
  mutate(my_fun_out = sapply(data, my_fun))

# A tibble: 3 x 3
  Species    data              my_fun_out
  <fct>      <list>                 <dbl>
1 setosa     <tibble [50 x 4]>        509
2 versicolor <tibble [50 x 4]>        717
3 virginica  <tibble [50 x 4]>        859