r - 如何在不拆分列的情况下合并 data.tables 列表?
问题描述
我即将合并大型数据集。这就是我尝试 data.table 并对其速度感到兴奋的原因。
# base R
system.time(
M1 <- Reduce(function(...) merge(..., all=TRUE), L)
)
# user system elapsed
# 5.05 0.00 5.20
# data.table
library(data.table)
L.dt <- lapply(L, function(x) setkeyv(data.table(x), c("sid", "id")))
system.time(
M2 <- Reduce(function(...) merge(..., all=TRUE), L.dt)
)
# user system elapsed
# 0.12 0.00 0.12
两种方法产生相同的值,但是有一些列是用 data.table 拆分的。
基数 R:
set.seed(1)
car::some(M1, 5)
# sid id V3 V4 a b
# 60504 1 60504 -0.6964804 -1.210195 NA NA
# 79653 1 79653 -2.5287163 -1.087546 NA NA
# 111637 2 11637 0.7104236 NA -1.7377657 NA
# 171855 2 71855 0.2023342 NA -0.6334279 NA
# 272460 3 72460 -0.5098994 NA NA 0.2738896
数据表:
set.seed(1)
car::some(M2, 5)
# sid id V3.x V4 V3.y a V3 b
# 1: 1 60504 -0.6964804 -1.210195 NA NA NA NA
# 2: 1 79653 -2.5287163 -1.087546 NA NA NA NA
# 3: 2 11637 NA NA 0.7104236 -1.7377657 NA NA
# 4: 2 71855 NA NA 0.2023342 -0.6334279 NA NA
# 5: 3 72460 NA NA NA NA -0.5098994 0.2738896
我错过了什么?或者有没有一种简单的方法来解决这个问题,即合并拆分列?(我不想使用任何其他软件包。)
数据
fun <- function(x){
set.seed(x)
data.frame(cbind(sid=x, id=1:1e5, matrix(rnorm(1e5*2), 1e5)))
}
tmp <- lapply(1:3, fun)
df1 <- tmp[[1]]
df2 <- tmp[[2]]
df3 <- tmp[[3]]
rm(tmp)
names(df2)[4] <- c("a")
names(df3)[4] <- c("b")
L <- list(df1, df2, df3)
解决方案
by
参数base::merge
默认为intersect(names(x), names(y))
wherex
和y
是要合并的 2 个表。因此,base::merge
也V3
用作合并键。
by
参数默认为两个表之间的data.table::merge
共享键列(即在这种情况下)sid
。id
并且由于表具有名为 的列V3
,因此会将后缀附加到新列中。
因此,如果您的意图是按所有公共列合并,您可以识别公共列,设置键然后合并:
commcols <- Reduce(intersect, lapply(L, names))
L.dt <- lapply(L, function(x) setkeyv(data.table(x), commcols))
M2 <- Reduce(function(...) merge(..., all=TRUE), L.dt)
推荐阅读
- java - ListView OnItemClickListener 歌曲
- azure - ASP.NET Core 的身份验证中间件是否总是对 OpenID Connect 使用隐式流?
- sql - 查询中的相对日期
- xml - 构建 APK 时出错。您可以在“消息”视图中找到错误。这是我的错误
- mysql - 如何在mysql中获取虚拟表达式?
- .net - .net 核心和全局阈值中未测试项目的代码覆盖率
- qt - QT 中的未知模块:3dstudioruntime2
- amazon-web-services - 如何使用 Amazon ALB 端口转发在单个 EC2 实例上运行多个服务
- python - 使用 PyQt5 创建用户表单
- php - 如何在while循环中在html表单上设置唯一ID