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

合并R数据框后观测数从940骤增至883600的问题排查求助

问题原因与解决方案

数据暴涨的核心原因

你用merge()合并两个数据框时,没有指定用于匹配的关联键,R会默认把两个数据框做笛卡尔积(即每一行和另一数据框的所有行配对)。你的HourlyActivity有940行,DailyActivity$Id也有940行,940×940=883600,这就是数据量暴增的原因。

另外你写的去重代码存在格式错误:AllActivity[duplicated(AllActivity$SedentaryHour)],数据框的索引格式是[行索引, 列索引],你只写了行的判断条件却没加逗号,R会把这个逻辑值当成列索引解析,所以报出"undefined columns selected"错误。


正确的操作方式

方法1:直接在原数据中新增小时列(最简便)

不需要新建多个数据框再合并,直接在DailyActivity里添加转换后的小时列:

# 直接在原数据框中生成小时列
DailyActivity$SedentaryHour <- DailyActivity$SedentaryMinutes / 60
DailyActivity$LightlyActiveHour <- DailyActivity$LightlyActiveMinutes / 60
DailyActivity$FairlyActiveHour <- DailyActivity$FairlyActiveMinutes / 60
DailyActivity$VeryActiveHour <- DailyActivity$VeryActiveMinutes / 60

# 查看处理后的数据
View(DailyActivity)

这样数据行数还是原来的940,每个Id的观测数保持正常,完全不需要后续的合并和去重操作。

方法2:新建数据框时直接包含Id

如果一定要单独创建包含小时数据的新数据框,直接把Id列一起放进data.frame()里,避免后续错误的合并:

# 生成小时列并直接包含Id
HourlyActivity <- data.frame(
  Id = DailyActivity$Id,
  SedentaryHour = DailyActivity$SedentaryMinutes / 60,
  LightlyActiveHour = DailyActivity$LightlyActiveMinutes / 60,
  FairlyActiveHour = DailyActivity$FairlyActiveMinutes / 60,
  VeryActiveHour = DailyActivity$VeryActiveMinutes / 60
)

View(HourlyActivity)

这个数据框的行数和原数据一致,每个Id的观测数保持约30条,符合你的预期。


已生成错误数据的可选修复(不推荐)

如果不想重新操作,要修复已经生成的883600行数据,可以用以下代码(但更推荐上面的方法,避免走弯路):

# 只保留每个Id和对应小时数据的正确配对(取行索引为1:940的倍数的行)
AllActivity_fixed <- AllActivity[seq(1, nrow(AllActivity), by = 940), ]

不过这个方法依赖于笛卡尔积的生成顺序,不如直接重新生成数据可靠。

内容的提问来源于stack exchange,提问作者sara romero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:13:20