【问题标题】:purrr::map_df with nested data.frame带有嵌套 data.frame 的 purrr::map_df
【发布时间】:2018-10-11 14:58:30
【问题描述】:

我想遍历一系列数据帧并将相同的函数应用于所有数据帧。

我正在尝试使用 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         |

【问题讨论】:

  • 你能给我们一个你想要的输出的例子吗?
  • 当您nest() 时,它实际上会在您的“父级”data.frame 中创建一个list 列(即iris)。要做你想做的事,你需要像这样将mutatemap 结合起来:%&gt;% mutate(data = map(data, ~my_fun))
  • @CPak 运行 iris_df %&gt;% group_by(Species) %&gt;% nest() %&gt;% 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 %&gt;% group_by(Species) %&gt;% nest() %&gt;% mutate(my_col = map_dbl(data, my_fun)) 根据@Renu 提供所需的输出。
  • @mark - 你是对的 - 我没有查看你的函数的返回值 - 假设它是你返回的 data.frame。 map_dbl 正如你所指出的那样工作,因为你返回的是一个数值

标签: r tidyr purrr


【解决方案1】:

问题在于nest() 为您提供了一个data.frame,其中包含data 列,该列是data.frames 的列表。您需要在nest() 输出的data 列上使用mapsapply,而不是整个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

【讨论】:

    猜你喜欢
    • 2021-03-21
    • 2019-12-27
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多