嵌套列表:将其排序为数据帧

时间:2016-04-04 20:13:01

标签: r list function dataframe

我有一个嵌套列表列表。每个嵌套列表的长度都不同。列表中的每个值都有一个分配给它的名称。我想从列表中创建一个数据框,但是对列表进行排序,以便每个值都在数据框中的正确列中。

用英语解释很难,我希望这个示例代码能够解释:

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

2 个答案:

答案 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