2015-10-18 54 views
7

我列出的以下列表:從同一矢量名單列表中提取所有值

list_1 <- list(a = 2, b = 3) 
list_2 <- list(a=c(5,6), b= c(2,3)) 
list_3 <- list(a=c(10,5,8,1), b=c(9,6,2,9)) 
list_4 <- list(a=c(2,5,58), b=c(69,6,23)) 
mylist <- list(list_1, list_2, list_3, list_4) 
names(mylist)<- c("list_1", "list_2", "list_3", "list_4") 

現在我想的是從列表中提取所有的a和b值,並將其保存無論是作爲與相應的列表名稱作爲像ID列data.frame:

[ID]  [a] [b] 
[1] list_1 2  3 
[2] list_2 5  2 
[3] list_2 6  3 
[4] list_3 10 9    
[5] list_3 5  6 
[6] list_3 8  2 
[7] list_3 1  9  
[8] list_4 2  69 
[9] list_4 5  6 
[10] list_4 58 23 

或作爲變量,使得a包含所有一個值,b包含所有的b值,並ID包含相應的列表ID:

[a] 
2 5 6 10 5 8 1 2 5 58 
[b] 
3 2 3 9 6 2 9 69 6 23 
[ID] 
"list_1" "list_2" "list_2" "list_3" "list_3" "list_3" "list_3" "list_4" "list_4" "list_4" 

我嘗試了for循環的第二種方法,但無法管理歸檔所需的結果。但即使我可以管理,我不知道如何解決ID的事情。如果解決方案可能是一個通用解決方案,那將是非常好的,因爲我有很多這樣的不同長度的列表。

回答

3

在基數R中,可以循環顯示名稱爲mylist的每個名稱,該名稱將生成一個名稱爲ID變量的數據框和來自相關元素mylist的所有變量。然後,你可以將所有生成的數據幀連同do.callrbind結合:

do.call(rbind, lapply(names(mylist), function(x) data.frame(c(ID=x, mylist[[x]])))) 
#  ID a b 
# 1 list_1 2 3 
# 2 list_2 5 2 
# 3 list_2 6 3 
# 4 list_3 10 9 
# 5 list_3 5 6 
# 6 list_3 8 2 
# 7 list_3 1 9 
# 8 list_4 2 69 
# 9 list_4 5 6 
# 10 list_4 58 23 
3

我只想rbind名單,並添加行名稱爲ID。這樣你根本不用擔心列名。或者,你可以離開row.namesID,只是用do.call(rbind.data.frame, mylist)

res <- do.call(rbind.data.frame, mylist) 
res$ID <- sub("\\..*", "", row.names(res)) 
row.names(res) <- NULL 
res 
#  a b  ID 
# 1 2 3 list_1 
# 2 5 2 list_2 
# 3 6 3 list_2 
# 4 10 9 list_3 
# 5 5 6 list_3 
# 6 8 2 list_3 
# 7 1 9 list_3 
# 8 2 69 list_4 
# 9 5 6 list_4 
# 10 58 23 list_4 

結清或者你也可以做

res <- do.call(rbind.data.frame, mylist) 
as.list(cbind(res, ID = row.names(res))) 
# $a 
# [1] 2 5 6 10 5 8 1 2 5 58 
# 
# $b 
# [1] 3 2 3 9 6 2 9 69 6 23 
# 
# $ID 
# [1] list_1 list_2.2 list_2.3 list_3.4 list_3.5 list_3.6 list_3.7 list_4.8 list_4.9 list_4.10 
# Levels: list_1 list_2.2 list_2.3 list_3.4 list_3.5 list_3.6 list_3.7 list_4.10 list_4.8 list_4.9 
1

這是一些額外的。我認爲purrr包在這種情況下提供了相當不錯的功能。以下內容返回與David Arenburg類似的列表。區別在於ID部分作爲每個向量中的名稱。

library(purrr) 
mylist %>% zip_n(.simplify = TRUE) 

#$a 
# list_1 list_21 list_22 list_31 list_32 list_33 list_34 list_41 
#  2  5  6  10  5  8  1  2 
#list_42 list_43 
#  5  58 
# 
#$b 
# list_1 list_21 list_22 list_31 list_32 list_33 list_34 list_41 
#  3  2  3  9  6  2  9  69 
#list_42 list_43 
#  6  23