要重现我的问题,请在 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 魔法可以做到这一点吗?
最佳答案
我们可以使用 rbindlist
和 fill = TRUE
来创建单个 data.table
,因为最好存储为单个数据集而不是列表中包含单行的多个数据集
library(data.table)
rbindlist(lapply(list.1, as.data.frame.list), fill = TRUE)
正如 @Frank 在评论中建议的那样,rbindlist
可以采用 list
rbindlist(lapply(list.1, as.list), fill=TRUE)
如果我们确实想要单独的data.frame
,一种选择是根据不存在的名称
创建列
lapply(list.1, function(x) {x1 <- as.data.frame.list(x)
x1[setdiff(paste0("name", 1:16), names(x))] <- 0
x1[paste0("name", 1:16)]})
#[[1]]
# name1 name2 name3 name4 name5 name6 name7 name8 name9 #name10 name11 name12 name13 name14 name15 name16
#1 0 11 0 0 0 13 0 0 0 0 0 0 0 0 0 0
#[[2]]
# name1 name2 name3 name4 name5 name6 name7 name8 name9 name10 name11 name12 name13 name14 name15 name16
#1 0 9 12 0 14 15 16 0 0 19 0 0 0 20 22 25
#[[3]]
# name1 name2 name3 name4 name5 name6 name7 name8 name9 name10 name11 name12 name13 name14 name15 name16
#1 0 0 0 5 0 0 0 0 8 0 0 0 0 0 0 11
#[[4]]
# name1 name2 name3 name4 name5 name6 name7 name8 name9 name10 name11 name12 name13 name14 name15 name16
#1 0 10 11 0 13 0 0 0 14 0 0 16 0 0 0 0
关于r - 从 R 中的列表列名称获取值表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43295474/