从R

时间:2017-04-08 14:46:18

标签: r

要重新创建我的问题,请在R

中使用此代码
list.1<-list(c(11L, 13L), c(9L, 12L, 14L, 15L, 16L, 19L, 20L, 22L, 25L), c(5L, 8L, 11L), c(10L, 11L, 13L, 14L, 16L))
names(list.1[[1]]) <- paste("name", c("2","6"), sep = "")
names(list.1[[2]]) <- paste("name", c("2","3", "5", "6", "7", "10", "14", "15", "16"), sep = "")
names(list.1[[3]]) <- paste("name", c("4","9", "16"), sep = "")
names(list.1[[4]]) <- paste("name", c("2","3", "5", "9", "12"), sep = "")

这将按以下方式创建名称列表

[1] name2 name6 
     11    13
[2] name2  name3  name5  name6  name7 name10 name14 name15 name16 
     9     12     14     15     16     19     20     22     25 

我希望以这种方式从上面的列表中获得数据框

[1] name1 name2  name3  name4 name5  name6 name7 name8 name9 name10 name11 etc. to name16
      0    11     0      0      0     13    0      0     0     0      0

[2]   0    9      12     0     14     15    16     0     0     0      0

基本上,我希望每个类别的名称都可能(名称1-16),即使它们在列表的每个元素中都缺失。

我之前的命令不起作用但是给了我一张只有缩短列表而没有缺失值的表格:

df.list1 <- as.data.frame(t(sapply(df.list1,'[',1:16))) 

这给了我16个所需的列,但没有给我丢失的列,所以我在每行中有不同的向量长度,NA填充剩余的空间(即它在前两列中堆叠的name2和name6我喜欢它们位于第二和第六列,其他列的值为零)。

有一些R魔法来做到这一点?

1 个答案:

答案 0 :(得分:4)

我们可以将rbindlistfill = TRUE一起使用来创建单个data.table,因为最好将其存储为单个数据集,而不是{{1}中包含单行的多个数据集}

list

正如@Frank在评论中建议的那样,library(data.table) rbindlist(lapply(list.1, as.data.frame.list), fill = TRUE) 可以采用rbindlist

list

如果我们真的想要个人rbindlist(lapply(list.1, as.list), fill=TRUE) ,一个选项是根据data.frame创建不存在的列

names