首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中合并list的所有元素?

如何在R中合并list的所有元素?
EN

Stack Overflow用户
提问于 2013-02-26 07:58:54
回答 4查看 44.1K关注 0票数 21

我有一个列表,其中包含数据帧作为R中的元素。

示例:

代码语言:javascript
复制
df1 <- data.frame("names"=c("John","Sam","Dave"),"age"=c(21,22,25))
df2 <- data.frame("names"=c("John","Sam"),"score"=c(22,25))
df3 <- data.frame("names"=c("John","Sam","Dave"),"country"=c("US","SA","NZ"))
mylist <- list(df1,df2,df3)

有没有可能在不使用循环的情况下将mylist的所有元素合并在一起?

对于这个例子,我想要的输出是:

代码语言:javascript
复制
  names age score country
1  John  21    22      US
2   Sam  22    25      SA

本例中的列表只有三个元素;但是,我正在寻找一个可以处理任意数量的元素的解决方案。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-26 10:08:16

您可以使用Reduce,一个线性解决方案:

代码语言:javascript
复制
Reduce(merge,mylist)

  names age score country
1  John  21    22      US
2   Sam  22    25      SA
票数 30
EN

Stack Overflow用户

发布于 2013-02-26 08:02:07

简单明了的例子:

代码语言:javascript
复制
merge(merge(df1, df2),df3)

编辑-非常类似的问题:Simultaneously merge multiple data.frames in a list

解决方案:

代码语言:javascript
复制
merged.data.frame = Reduce(function(...) merge(..., all=F), my.list)

免责声明--我从@Charles answer改成了merge(..., all=F),而不是T -这样它就会给出你想要的输出。

票数 8
EN

Stack Overflow用户

发布于 2013-02-26 10:21:47

只是为了表明它可以用另一种方式来做。

代码语言:javascript
复制
mymerge <- function(mylist) {
  names(mylist) <- sapply(mylist, function(x) names(x)[2])
  ns <- unique(unlist(lapply(mylist, function(x) levels(x$names))))
  as.data.frame(c(list(names=ns), lapply(mylist, function(x) 
                         {x[match(ns, x$names),2]})))
}

> mymerge(mylist)
  names age score country
1  Dave  25    NA      NZ
2  John  21    22      US
3   Sam  22    25      SA

人们可以很容易地适应删除缺少值的行,或者使用complete.cases删除之后的行。

为了证明它更快,我们将构建一个更大的数据集;100个变量和25个名称。

代码语言:javascript
复制
set.seed(5)
vs <- paste0("V", 1:100)
mylist <- lapply(vs, function(v) {
  x <- data.frame(names=LETTERS[1:25], round(runif(25, 0,100)))
  names(x)[2] <- v
  x
})

> microbenchmark(Reduce(merge, mylist), myf(mylist))
Unit: milliseconds
                   expr       min        lq    median        uq       max
1           myf(mylist)  12.81371  13.19746  13.36571  14.40093  33.90468
2 Reduce(merge, mylist) 199.23714 206.28608 207.30247 208.44939 226.05980
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15078896

复制
相关文章

相似问题

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