purrr::map_df 嵌套 data.frame
purrr::map_df with nested data.frame
我想遍历一系列数据帧并对它们应用相同的函数。
我正在尝试使用 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
我做错了什么?有不同的方法吗?
编辑:
澄清我想要的输出。针对包含输出的新列 eg
|Species|Data|my_function_output|
|:------|:---|:-----------------|
|setosa |<tibble>|509.1 |
问题是 nest()
给你一个 data.frame,其中有一列 data
,它是 data.frame 的列表。您需要 map
或 sapply
覆盖 nest()
输出的 data
列,而不是整个 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
我想遍历一系列数据帧并对它们应用相同的函数。
我正在尝试使用 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
我做错了什么?有不同的方法吗?
编辑: 澄清我想要的输出。针对包含输出的新列 eg
|Species|Data|my_function_output|
|:------|:---|:-----------------|
|setosa |<tibble>|509.1 |
问题是 nest()
给你一个 data.frame,其中有一列 data
,它是 data.frame 的列表。您需要 map
或 sapply
覆盖 nest()
输出的 data
列,而不是整个 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