首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将不同长度的列表组合成数据帧

将不同长度的列表组合成数据帧
EN

Stack Overflow用户
提问于 2017-03-13 22:48:52
回答 2查看 4.7K关注 0票数 2

我有像下面的SampleData这样的数据,它有不同长度的列表,我想将它们组合成像下面所希望的结果那样的数据框架。我尝试使用来自qpcR包的lapply和qpcR,如下面的示例所示,但出于某种原因,它不允许我将结果转换为数据框架。如果我只使用了两个列表和cbind.na,它就会将它们组合在一起,并按照我的意愿将NA添加到末尾,但是当我尝试在lapply中使用它时,它只会将它们作为一个不同长度列表的列表。任何提示都是非常感谢的。

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-13 23:04:52

我查看数据的第一本能是,通过使用data.frame,您可以隐式地声明行中的项是成对的。也就是说,在您的示例中,$V1的"3“和$V3的"6”意味着相互关联。(如果您查看mtcars,第一行的每一列都直接与"Mazda RX4“关联。)如果这不是真的,那么将它们扭曲成这样的data.frame是错误的--表示您的数据,并且鼓励错误的分析/假设。

假设它们实际上是“配对”的,我的下一个本能是尝试类似do.call(cbind, SampleData)的东西,但这有助于回收数据,而不是您想要的。因此,阻止回收的诀窍是强迫它们保持相同的长度。

代码语言:javascript
复制
maxlen <- max(lengths(SampleData))
SampleData2 <- lapply(SampleData, function(lst) c(lst, rep(NA, maxlen - length(lst))))

我们可以先重命名:

代码语言:javascript
复制
names(SampleData2) <- paste("V", seq_along(SampleData2), sep = "")

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

代码语言:javascript
复制
SampleData3 <- lapply(SampleData2, unlist)

那么它就像直挺挺的:

代码语言:javascript
复制
as.data.frame(SampleData3)
#   V1 V2 V3
# 1  1  1  3
# 2  2  2  4
# 3  3 NA  6
# 4 NA NA  7
票数 2
EN

Stack Overflow用户

发布于 2017-03-14 03:13:06

下面是一个带有length<-赋值的修改版本

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42774843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档