我有一个数据框列表(或我猜的值),我需要将其列入list-list-dataframe格式的list-dataframe格式。请参阅下面的简单示例。
library(plyr)
my_function= function(df){
means = mean(df$mpg)
sds = sd(df$mpg)
# or
# means = mtcars * rnorm(1)
# sds = cars * rnorm(1)
output = list(MEAN = means, SD = sds)
return(output)
}
list_of_dfs=plyr::dlply(.data = mtcars, .variables ='cyl')
output = lapply(list_of_dfs, my_function)
现在我想聚合它,因此CYL = 4/6/8的所有SD
值都在一个数据帧中,而MEAN
值在第二个数据帧中。
我已经尝试do.call(rbind, output)
,但我无法理解。
是的,我知道我可以在这里进行某种分组,然而,这只是一个例子。您可以将列表中的每个值视为实际数据帧而不是计算输出。
答案 0 :(得分:0)
这可能是你想要的:它有点棘手,因为有几个级别的嵌套。
首先,从n
的每个元素中提取元素output
的函数:
tmpf <- function(n) sapply(output,function(x) x[[n]])
tmpf("MEAN")
## 4 6 8
## 26.66364 19.74286 15.10000
现在将该函数应用于元素列表:
v <- names(output[[1]]) ## "MEAN" "SD"
r <- setNames(lapply(v,tmpf),v)
## $MEAN
## 4 6 8
## 26.66364 19.74286 15.10000
##
## $SD
## 4 6 8
## 4.509828 1.453567 2.560048
如果您真的想要数据框,可以lapply(r,as.data.frame)
要处理您的第二个更复杂的案例,您可以按如下方式扩展tmpf
:
tmpf2 <- function(n) do.call(rbind,lapply(output,function(x) x[[n]]))
或
tmpf2 <- function(n) dplyr::bind_rows(lapply(output,function(x) x[[n]]))
(对于purrr
包,可能采用纯粹的方法来做到这一点。)
第二步保持不变:
r <- setNames(lapply(v,tmpf2),v)