如何将数据帧列表列入数据帧列表

时间:2016-11-03 02:15:19

标签: r list plyr rbind

我有一个数据框列表(或我猜的值),我需要将其列入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),但我无法理解。

是的,我知道我可以在这里进行某种分组,然而,这只是一个例子。您可以将列表中的每个值视为实际数据帧而不是计算输出。

1 个答案:

答案 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)