2012-05-31 52 views
2

我需要從列表的特定子列表創建數據幀。我知道這個特定子列表中的數據結構是不變的。對於一個列表,我發現do.call()會做的伎倆:將列表的特定子列表強制轉換爲基於R的矩陣/數據幀

lst<-list(l1="aa", l2="ab", l3="ac") 
fun.sublst1<-function(n) { 
    a<-c("a",1,n) 
    return(a) 
} 
lstoflst<-lapply(lst, fun.sublst1) 
do.call(rbind,lstoflst) # create a data frame from a list 

但是,如果我有一個名單列表,我想遍歷一個特定的子表,我不能夠使用do.call (rbind,lstoflst $ A)來創建數據框。

# section list of list 
fun.sublst2<-function(n) { 
    a<-c("a",1,n) 
    b<-c("b",2) 
    return(list(A=a,B=b)) 
} 
lstoflst<-lapply(lst, fun.sublst2) 
# result should create a dataframe consisting of all sublists $A 
t(cbind(lstoflst$l1$A,lstoflst$l2$A,lstoflst$l3$A)) 

笨拙的代碼看起來就像那樣。

dat<-t(as.data.frame(lstoflst[[1]][[1]])) 
for(i in 2:length(lstoflst)) { 
    dat<-rbind(dat,t(lstoflst[[i]][[1]])) 
} 

有沒有一個優雅的方式來做到這一點與基地R?我想do.call(rbind,lstoflst,???)和其他一些參數都可以。我想我需要通過索引或索引函數。任何幫助?

我搜索了,但我沒有運氣與我的搜索字詞。可能它已經被解決了。無論如何,希望你能指導我。謝謝

編輯:改變標題,因爲我的例子只產生矩陣作爲結果。

+0

我不知道我關注。你的例子都沒有創建數據框。你知道'c()'創建一個原子向量,而不是一個列表? – joran

+0

嗨,以及我的示例解決方案創建矩陣 - 類(dat)。你是對的。然而,問題是在n個包含m個原子元素的列表的列表元素中創建一個(n x m)數據類型結構。也許我的英語不夠好,無法正確表達自己。此外,我認爲我的R術語知識水平很低。任何不便敬請諒解。 – Sebastian

+0

好吧,我現在看到我的工作中與數據幀矩陣差異的觀點。很顯然,我的示例dat不夠準確。所以,而不是c()我可能應該使用<-list(V1 =「a」,V2 = 1,V3 = n)。但是,我也可以使用矩陣。感謝您澄清它。 – Sebastian

回答

4

如果你知道你想要的清單組件的名稱(在這種情況下,「A」),你可以在列表子集內每個列表:

lsSub <- lapply(lstoflst, "[[", "A") 

,然後rbind

do.call(rbind, lsSub) 
# [,1] [,2] [,3] 
# l1 "a" "1" "aa" 
# l2 "a" "1" "ab" 
# l3 "a" "1" "ac" 

但是,正如喬蘭指出的那樣,這不是一個data.frame

+0

是的,我剛剛意識到數據框架和矩陣的重點。這在我身邊是不正確的。儘管如此,你和安德里提供的解決方案完成了我期望的工作。我喜歡你的觀點與「[[」。謝謝。 – Sebastian

+0

+1這非常整齊。 – Andrie

1

這似乎笨重,但工程。

do.call(rbind, 
    lapply(lstoflst, function(x){xx <- x[names(x) %in% "A"]; do.call(rbind, xx)}) 
) 

    [,1] [,2] [,3] 
A "a" "1" "aa" 
A "a" "1" "ab" 
A "a" "1" "ac" 

也許有人可以做一些聰明的東西與rapply,但我無法得到它的工作。