将不同长度的列表组合到数据帧中

时间:2017-03-13 22:48:53

标签: r lapply cbind

我有类似下面的SampleData的数据,其中包含不同长度的列表,我希望将其组合到数据框中,如下面的Desired Result。我尝试使用qpcR包中的lapply和cbind.na,如下例所示,但由于某种原因,它不允许我将结果转换为数据帧。如果我只使用了两个列表和cbind.na,它将组合它们并将NA添加到我想要的结尾,但是当我尝试在lapply中使用它时,它只是将它们留作不同长度列表的列表。任何提示都非常感谢。

SampleData<-list(list(1,2,3),list(1,2),list(3,4,6,7))

Desired Result:
structure(list(V1 = c(1, 2, 3, NA), V2 = c(1, 2, NA, NA), V3 = c(3, 
4, 6, 7)), .Names = c("V1", "V2", "V3"), row.names = c(NA, -4L
), class = "data.frame")


Example Code:

lapply(SampleData,qpcR:::cbind.na)

2 个答案:

答案 0 :(得分:1)

我的第一直觉是,通过使用data.frame,您隐含地声明一行中的项目是配对。也就是说,在你的例子中,&#34; 3&#34; $V1和&#34; 6&#34; $V3的意思是彼此相关联。 (如果您查看mtcars,第一行的每一列都与直接 与&#34;马自达RX4&#34;相关联。)如果这不是真的,然后将它们变成像data.frame这样的错误表示你的数据,并鼓励不正确的分析/假设。

假设他们实际上已配对&#34;,我的下一个本能就是尝试像do.call(cbind, SampleData)这样的东西,但这会带来回收的数据,而不是你想要的。因此,阻止回收的技巧是强迫它们长度相同。

maxlen <- max(lengths(SampleData))
SampleData2 <- lapply(SampleData, function(lst) c(lst, rep(NA, maxlen - length(lst))))

我们可以先重命名:

names(SampleData2) <- paste("V", seq_along(SampleData2), sep = "")

由于数据看起来是同质的(并且应该是,如果您打算将每个元素作为data.frame的列),则取消列出它是有用的:

SampleData3 <- lapply(SampleData2, unlist)

然后它就像:

一样直截了当
as.data.frame(SampleData3)
#   V1 V2 V3
# 1  1  1  3
# 2  2  2  4
# 3  3 NA  6
# 4 NA NA  7

答案 1 :(得分:1)

以下是length<-作业

的修改版本
setNames(do.call(cbind.data.frame, lapply(lapply(SampleData, unlist), 
        `length<-`, max(lengths(SampleData)))), paste0("V", 1:3))
#  V1 V2 V3
#1  1  1  3
#2  2  2  4
#3  3 NA  6
#4 NA NA  7