首页 > 解决方案 > R:有效地合并 1000 多个变量

问题描述

我有 1000 多个具有完全相同尺寸和相同列的数据集,我需要从 Web 加载(使用 jsonlite)然后合并。我可以选择 data.frame 名称,但不能更改数据本身。我可以手动完成这一切,但可能有更有效的方法来做到这一点。让我用这个三个数据集的例子来说明我的意思。

cola             <- c(1, 2, 3, 4)
x0001            <- c(10, 11, 12, 13)
x0002            <- c(20, 22, 25, 29)
x0003            <- c(30, 31, 33, 38)
df0001           <- data.frame(cola, x0001)
colnames(df0001) <- c("A","B")
df0002           <- data.frame(cola, x0002)
colnames(df0002) <- c("A","B")
df0003           <- data.frame(cola, x0003)
colnames(df0003) <- c("A","B")
# data.frame names do not matter to me

alldata <- Reduce(function(x,y) merge(x=x, y=y, by="A"), list(df0001, df0002, df0003))
colnames(alldata) <- c("A", "df0001", "df0002", "df0003")

如果我通过列出所有 1000 多个变量来手动合并到 alldata 和 colnames() 函数,将会很长。也许有更好的方法,也许有一个循环?

标签: r

解决方案


如果对象都加载到内存中,您可以使用mgetls(pattern = ...)函数将所有对象加载到列表中。

dfs <- mget(ls(pattern = "df[0-9]+"))
dfs
#$df0001
#  A  B
#1 1 10
#2 2 11
#3 3 12
#4 4 13
#
#...
#
#$df0003
#  A  B
#1 1 30
#2 2 31
#3 3 33
#4 4 38

如果data.frames 总是具有相同的列,以相同的顺序,您可以使用do.call

cbind(dfs[[1]],do.call(cbind,lapply(dfs[-1],`[`,,-1)))
#  A  B df0002 df0003
#1 1 10     20     30
#2 2 11     22     31
#3 3 12     25     33
#4 4 13     29     38

否则,您可以使用Reduce

Reduce(function(x,y) merge(x,y,by = "A"), dfs)
#  A B.x B.y  B
#1 1  10  20 30
#2 2  11  22 31
#3 3  12  25 33
#4 4  13  29 38

的缺点Reduce是它会导致大量的内存分配。


推荐阅读