r - R dplyr: 将列表输出写入 dataframe

假设我有以下函数


SlowFunction = function(vector){


 return(list(


 mean =mean(vector),


 sd = sd(vector)


 ))


 }



我想使用 dplyr:summarise 将结果写到dataframe中:


iris %>% 


 dplyr::group_by(Species) %>% 


 dplyr::summarise(


 mean = SlowFunction(Sepal.Length)$mean,


 sd = SlowFunction(Sepal.Length)$sd


 )



有没有人有一个建议如何通过调用"SlowFunction "一次而不是两次来做到这一点? (在我的代码中"SlowFunction "是一个很慢的函数,我必须多次调用。)当然,在两部分中没有拆分"SlowFunction "。 所以实际上我想在一个语句中填充dataframe的多个列。

时间:

选项是用来将 SlowFunction的输出存储在 data.framelist 列中,然后使用 unnest


iris %>%


 group_by(Species) %>%


 summarise(res = list(as.data.frame(SlowFunction(Sepal.Length)))) %>%


 unnest()


## A tibble: 3 x 3


# Species mean sd


# <fct> <dbl> <dbl>


#1 setosa 5.01 0.352


#2 versicolor 5.94 0.516


#3 virginica 6.59 0.636



在不改变当前 SlowFunction的情况下,使用 do


library(dplyr)



iris %>% 


 group_by(Species) %>% 


 do(data.frame(SlowFunction(.$Sepal.Length)))



# Species mean sd


# <fct> <dbl> <dbl>


#1 setosa 5.01 0.352


#2 versicolor 5.94 0.516


#3 virginica 6.59 0.636



或者使用 group_split + purrr::map_dfr


bind_cols(Species = unique(iris$Species), iris %>%


 group_split(Species) %>%


 map_dfr(~SlowFunction(.$Sepal.Length)))



如果你使用 dplyr 0.8.0 或者更高版本,我们可以使用 group_mapSlowFunction的输出需要转换为数据帧。


library(dplyr)



iris %>% 


 group_by(Species) %>% 


 group_map(~SlowFunction(.x$Sepal.Length) %>% as.data.frame())


# # A tibble: 3 x 3


# # Groups: Species [3]


# Species mean sd


# <fct> <dbl> <dbl>


# 1 setosa 5.01 0.352


# 2 versicolor 5.94 0.516


# 3 virginica 6.59 0.636



我们可以更改 SlowFunction 以返回 tibble


SlowFunction = function(vector){


 tibble(


 mean =mean(vector),


 sd = sd(vector)


 )


 }



然后在 unnest 中输出 summarise 输出


iris %>% 


 group_by(Species) %>% 


 summarise(out = list(SlowFunction(Sepal.Length))) %>%


 unnest


# A tibble: 3 x 3


# Species mean sd


# <fct> <dbl> <dbl>


#1 setosa 5.01 0.352


#2 versicolor 5.94 0.516


#3 virginica 6.59 0.636



...