我有一个嵌套列表列表。每个嵌套列表的长度都不同。列表中的每个值都有一个分配给它的名称。我想从列表中创建一个数据框,但是对列表进行排序,以便每个值都在数据框中的正确列中。
用英语解释很难,我希望这个示例代码能够解释:
list <- list(1,1:2,1:3)
names(list[[1]]) <- "a"
names(list[[2]]) <- c("c", "a")
names(list[[3]]) <- c("a","c","b")
table <- matrix(NA, nrow = 3, ncol = 3)
colnames(table) <- c("a","b","c")
> list
[[1]]
a
1
[[2]]
c a
1 2
[[3]]
a c b
1 2 3
> table
a b c
[1,] NA NA NA
[2,] NA NA NA
[3,] NA NA NA
我想将列表排序到表中,如下所示:
>table
a b c
list[[1]] 1 NA NA
list[[2]] 2 NA 1
list[[3]] 1 3 2
以便列表中值的名称与表格中列的名称相匹配,list[[1]]
转到第1行,list[[2]]
转到第2行,等等。
任何帮助将不胜感激。
(附加信息:
我的实际数据集有数万个嵌套列表,最长的列表有26个长度。
我在Windows 10上运行32位R 3.2.4
答案 0 :(得分:5)
我们可以smartbind()
包与gtools
结合使用do.call()
。
library('gtools')
do.call("smartbind", list)
# a c b
#1 1 NA NA
#2 2 1 NA
#3 1 2 3
答案 1 :(得分:2)
您可以将它们转换为数据框,并使用可在列表列表中使用的<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<include layout="@layout/frag"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
</RelativeLayout>
编辑2 - 使用data.table::rbindlist
上的gtools::smartbind
作为更复杂的嵌套列表列表:
rapply
编辑1 - 此版本可能更有效
list <- list(1,1:2,1:3)
names(list[[1]]) <- "a"
names(list[[2]]) <- c("c", "a")
names(list[[3]]) <- c("a","c","b")
list <- c(list(list, list(list)), list)
l <- rapply(list, function(x) data.frame(as.list(x)), how = 'list')
do.call(gtools::smartbind, l)
# a c b
# 1 1 1 3
# 2 1 1 3
# 3 1 NA NA
# 4 2 1 NA
# 5 1 2 3
原始
list <- list(1,1:2,1:3)
names(list[[1]]) <- "a"
names(list[[2]]) <- c("c", "a")
names(list[[3]]) <- c("a","c","b")
library('data.table')
list <- rapply(list, function(x) setDT(as.list(x)), how = 'list')
# [[1]]
# a
# 1: 1
#
# [[2]]
# c a
# 1: 1 2
#
# [[3]]
# a c b
# 1: 1 2 3
rbindlist(list, fill = TRUE)[, c('a','b','c'), with = FALSE]
# a b c
# 1: 1 NA NA
# 2: 2 NA 1
# 3: 1 3 2