【发布时间】:2018-10-11 14:58:30
【问题描述】:
我想遍历一系列数据帧并将相同的函数应用于所有数据帧。
我正在尝试使用 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 |
【问题讨论】:
-
你能给我们一个你想要的输出的例子吗?
-
当您
nest()时,它实际上会在您的“父级”data.frame 中创建一个list列(即iris)。要做你想做的事,你需要像这样将mutate和map结合起来:%>% mutate(data = map(data, ~my_fun)) -
@CPak 运行
iris_df %>% group_by(Species) %>% nest() %>% mutate(my_col = map_df(data, ~my_fun))。返回#Error in mutate_impl(.data, dots) : Evaluation error: Argument 1 must be a data frame or a named atomic vector, not a function. -
抱歉@CPak 错误地使用了
map_df,但map没有给出正确的输出。iris_df %>% group_by(Species) %>% nest() %>% mutate(my_col = map_dbl(data, my_fun))根据@Renu 提供所需的输出。 -
@mark - 你是对的 - 我没有查看你的函数的返回值 - 假设它是你返回的 data.frame。
map_dbl正如你所指出的那样工作,因为你返回的是一个数值