从具有相同向量名称的列表列表中提取所有值

时间:2015-10-18 21:48:28

标签: r

我有以下列表清单:

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值,并将它们保存为data.frame,并将相应的列表名称作为ID列,如:

    [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 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

我只会rbind列表并将行名称添加为ID。这样您就不必担心列名。或者您可以将row.names保留为ID,然后与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

答案 2 :(得分:1)

这有点多余。我认为[0, 2, ...]包提供了一些非常好的东西。以下返回与David Arenburg类似的列表。区别在于ID部分在每个向量中保留为名称。

purrr