我希望迭代一系列数据帧并将相同的功能应用于所有数据帧。
我正在使用tidyr::nest
和purrr::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 |
答案 0 :(得分:2)
问题是nest()
为您提供了一个data.frame,其中包含一列data {frame}列data
。您需要在map
输出的sapply
列上data
或nest()
,而不是整个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