合并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
相关产品推荐
相关产品推荐

