R中按行索引合并失败:by=0与by="row.names"均无效
原因与解决方案
核心原因
混淆了**base R的merge()与data.table包的merge.data.table()**的参数规则:
by=0和by="row.names"是base Rmerge()的专属语法,merge.data.table()不支持这两种写法。merge.data.table()要求by参数必须是两个表中都存在的实际列名,不能用这类特殊占位符。- 另外,
d_fitted是通过cbind()生成的对象,其行索引列的名称并非row.names,因此by="row.names"无法匹配到对应列。
高效解决方案
无需使用merge,直接给原数据子集添加拟合值列是最简洁高效的方式:
# 提取目标子集 foo_sub <- foo[agegroup == "18-30",] # 直接在子集上添加拟合值列 foo_sub[, fitted := mq_age1[[10]]$fitted.values]
若坚持使用merge的方案
先给两个表添加明确的行索引列,再按列名合并:
# 给原数据子集添加行索引列 foo_sub <- foo[agegroup == "18-30",][, row_id := .I] # 构造带匹配行索引的拟合值表 fitted_vals <- mq_age1[[10]]$fitted.values d_fitted <- data.table(row_id = attr(fitted_vals, "index"), fitted = fitted_vals) # 按行索引列合并 foo2 <- merge(foo_sub, d_fitted, by = "row_id", all.x = TRUE)
补充说明
data.table的设计逻辑是避免依赖行名,更推荐使用显式索引列或直接在子集上操作。直接赋值的方式不仅代码更简洁,执行效率也远高于merge操作。
内容的提问来源于stack exchange,提问作者Sarah Hirsch
相关产品推荐
相关产品推荐

