【问题标题】:how to make a list of a lists of data frames into a list of data frames如何将数据框列表的列表制作成数据框列表
【发布时间】:2016-11-03 02:15:18
【问题描述】:

我有一个数据框列表(或我猜的值),我需要将其放入 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),但我不明白。

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

【问题讨论】:

  • 您是说,对于数据集中的每个级别的cyl,您要计算mpg 的均值和标准差吗?如果是这样,有更有效的方法来做到这一点。例如,使用 plyrddply(mtcars, .(cyl), summarize, mean = mean(mpg), sd = sd(mpg))
  • 嘿,所以也许实际上发布了有效的 R 代码,这样人们才能真正帮助你。
  • 我修好了对不起,伙计们。是的,我知道您可以进行某种分组,但这只是一个基本示例 - 这些实际上是数据帧,因此如果有帮助,您可以将相应的值视为 mtcars 或 iris 等数据帧。

标签: r list plyr rbind


【解决方案1】:

这可能是您想要的:这有点棘手,因为有多个嵌套级别。

首先,从output的每个元素中提取元素n的函数:

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)

【讨论】:

  • 对不起,我认为这真的很接近我所追求的但如果我取消注释 #means = mtcars * rnorm(1) # sds = cars * rnorm(1) 以便它是实际数据框架我想我只是错过了一些我无法弄清楚的东西。我想附加(rbind 样式)这些相应的数据帧,所以只有两个主表(MEAN,SD)而不是 6 =3cyl 值 *(mean/sd)
猜你喜欢
  • 2013-07-04
  • 1970-01-01
相关资源
最近更新 更多