r - 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() 函数,将会很长。也许有更好的方法,也许有一个循环?
解决方案
如果对象都加载到内存中,您可以使用mget
和ls(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.frame
s 总是具有相同的列,以相同的顺序,您可以使用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
是它会导致大量的内存分配。
推荐阅读
- python - 使用电子邮件查询 django 默认用户模型对象
- regex - 如何使用正则表达式在命令行中删除以“./.../.../”开头的行的特定部分?
- java - Robolectric::LayoutInflator.inflate() 挂在 onCreateOptionsMenu
- python - ParseResults getName() 返回无
- javascript - 更改 html 元素的 onclick 事件时遇到错误
- javascript - 饼图插值无法正常工作
- python - 运行.exe时模块对象没有属性SFrame
- amazon-web-services - 你能克隆一个 AWS lambda 吗?
- git - 如何使 gitignore 排除 2 个文件夹中存在的特定 js 文件,而忽略所有其他 js 文件?
- sql - 有联接时如何从多个表中进行选择?