2016-11-03 148 views
-2

我有一列數據幀列表(或者我猜想的值),我需要將它們放入list-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) 

我想聚集它,這樣所有的SD值CYL = 4/6/8是在一個數據幀和第二數據幀中的MEAN值。我試過do.call(rbind, output)但是我弄不明白。

是的,我知道我可以做一些類型的組合,在這裏,但是,這只是一個例子。您可以將列表中的每個值都視爲實際數據框而不是計算輸出。

+0

你是說,對於數據集中的每個'cyl'級別,你想計算'mpg'的平均值和sd?如果是這樣,有更有效的方法來做到這一點。例如,使用_plyr_:'ddply(mtcars,。(cyl),summary,mean = mean(mpg),sd = sd(mpg))' – jdobres

+2

嘿,所以大概實際上可以幫助你。 – hrbrmstr

+0

我修好了抱歉,夥計們。是的,我知道你可以做一些分組,但這只是一個基本的例子 - 這些實際上是數據框架,所以如果它可以幫助你將相應的值想象爲像mtcars或虹膜這樣的數據框。 – runningbirds

回答

0

這可能是你想要的:這有點棘手,因爲有幾個層次的嵌套。

首先,功能從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作爲fo llows:

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包來完成一個純粹的tidyverse方式。)

第二步保持不變:

r <- setNames(lapply(v,tmpf2),v) 
+0

對不起,我認爲這是非常接近我後,但如果我取消註釋#means = mtcars * rnorm(1) #sds = cars * rnorm(1),以便它是實際的數據幀,我想我是隻是想念我無法弄清楚的事情。我想追加(rbind風格)這些相應的數據幀,所以只有兩個主表(MEAN,SD)而不是6 = 3cyl值*(mean/sd) – runningbirds