2012-08-13 59 views
0

我有一個數據幀,df和函數process,返回兩個數據幀的列表,ab。我使用dlply將id列上的df分開,然後返回數據框列表的列表。下面是樣本數據/代碼近似於實際的數據和方法:rbinding基於嵌套順序的數據幀列表

df <- data.frame(id1=rep(c(1,2,3,4), each=2)) 

process <- function(df) { 
    a <- data.frame(d1=rnorm(1), d2=rnorm(1)) 
    b <- data.frame(id1=df$id1, a=rnorm(nrow(df)), b=runif(nrow(df))) 
    list(a=a, b=b) 
} 

require(plyr) 
output <- dlply(df, .(id1), process) 

output是dataframes的名單列表,嵌套列表總會有兩個dataframes,命名爲ab。在這種情況下,外部列表的長度爲4

什麼我期待產生與所有a dataframes一個數據幀,與id列指示各自的值(我相信這是在列表中左邊沿split_labels屬性,請參閱str(輸出))。然後類似地對於b數據幀。

到目前爲止,我已經在部分使用這個question想出這樣的代碼:

list <- unlist(output, recursive = FALSE) 
list.a <- lapply(1:4, function(x) { 
    list[[(2*x)-1]] 
}) 
all.a <- rbind.fill(list.a) 

這給了我最後的a數據框(且同樣b用不同的標爲list),但是它不沒有我需要的id列,我非常肯定,必須有一個更直接或優雅的解決方案。理想情況下使用plyr清理乾淨。

+0

我不明白這是什麼意思'all.a'「沒有我需要的id列」。如果你需要的id列與'output [[i]] $ b'中的id列是相同的'id1',那麼你不能將它添加到你的'process'函數嗎? – 2012-08-13 16:23:42

回答

1

不是很乾淨,但你可以嘗試這樣的事情(假設相同的數據生成過程)。

list.aID <- lapply(1:4, function(x) { 
cbind(list[[(2*x) - 1]], list[[2*x]][1, 1, drop = FALSE]) 
}) 

all.aID <- rbind.fill(list.aID) 
all.aID 

all.aID 
     d1  d2 id1 
1 0.68103 -0.74023 1 
2 -0.50684 1.23713 2 
3 0.33795 -0.37277 3 
4 0.37827 0.56892 4