R语言按共同变量合并数据集出现0观测及观测数异常问题排查
合并数据集时的两个问题解析
问题1:merge(A, B, by = "date", "ID")输出0观测的原因
- 参数格式错误:
merge函数的by参数需要用向量形式指定多个合并键,正确写法是by = c("date", "ID")。你分开传入的"ID"会被误当作by.x参数,此时实际执行的是用A的ID列和B的date列匹配,这两个列的取值完全不相关,自然没有匹配结果,所以得到0条观测。 - 额外排查点:你提到共同变量是
Date,但代码里用的是小写date。如果数据集里的列名是大写Date,小写的date会被视为不存在的列,直接导致匹配逻辑完全错误。
问题2:merge(A, B, by = c("date", "ID"), all = TRUE)观测数异常的原因
- 键值对非唯一:如果A或B中存在同一个
ID+date组合的重复行,merge时会对重复行做笛卡尔积匹配。比如A中某ID+date有2条,B中同组合有3条,就会生成2×3=6条记录,直接放大观测数。 all=TRUE的影响:这个参数会保留A和B中所有不匹配的键。假设A有大量ID+date在B中没有对应,B也有大量在A中没有对应,这些不匹配的行都会被保留下来,加上匹配行的笛卡尔积,最终总数就会远大于你预期的3000条。- 验证方法:可以用
duplicated(A[, c("ID", "date")])和duplicated(B[, c("ID", "date")])检查是否有重复行;再用nrow(merge(A, B, by = c("ID", "date")))统计真正匹配的记录数,就能明确最终观测数的构成。
内容的提问来源于stack exchange,提问作者Hasan Sohail
相关产品推荐
相关产品推荐

