我有一个列表,其中包含数据帧作为R中的元素。
示例:
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的所有元素合并在一起?
对于这个例子,我想要的输出是:
names age score country
1 John 21 22 US
2 Sam 22 25 SA本例中的列表只有三个元素;但是,我正在寻找一个可以处理任意数量的元素的解决方案。
发布于 2013-02-26 10:08:16
您可以使用Reduce,一个线性解决方案:
Reduce(merge,mylist)
names age score country
1 John 21 22 US
2 Sam 22 25 SA发布于 2013-02-26 08:02:07
简单明了的例子:
merge(merge(df1, df2),df3)编辑-非常类似的问题:Simultaneously merge multiple data.frames in a list
解决方案:
merged.data.frame = Reduce(function(...) merge(..., all=F), my.list)免责声明--我从@Charles answer改成了merge(..., all=F),而不是T -这样它就会给出你想要的输出。
发布于 2013-02-26 10:21:47
只是为了表明它可以用另一种方式来做。
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个名称。
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.05980https://stackoverflow.com/questions/15078896
复制相似问题