我有以下列表清单:
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问题。如果解决方案可能是一般的解决方案会很棒,因为我有许多不同长度的列表。
答案 0 :(得分:3)
在基础R中,您可以遍历mylist
的名称,为每个名称生成一个具有该名称的数据框作为ID
变量,以及来自mylist
的相关元素的所有变量}。然后,您可以将所有生成的数据框与do.call
和rbind
:
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