You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R中按行索引合并失败:by=0与by="row.names"均无效

原因与解决方案

核心原因

混淆了**base R的merge()与data.table包的merge.data.table()**的参数规则:

  • by=0和by="row.names"是base R merge()的专属语法,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:40:21