R语言横向合并dataframe时merge函数返回NA行问题求解
merge操作出现NA值的原因
你遇到的问题核心是两个数据框的ID列实际内容不匹配,看起来取值一致但被R判定为不同值,全连接参数all=TRUE会将两边未匹配到的行都保留,所以出现了大量NA值,常见的不匹配场景包括:
- 其中一个
ID列的取值前后存在肉眼不可见的空白字符(空格、制表符、换行符等),比如AllPlates$ID中的P1A1实际为"P1A1 ",和data$ID中的"P1A1"判定为不同值 - 两个
ID列的类型不一致,比如一列为因子(factor)类型、另一列为字符串(character)类型,且因子的levels和另一列的字符串无法完全对应 - 存在大小写差异、全半角符号差异这类肉眼难分辨的内容区别
验证方法
你可以运行以下代码确认ID是否存在不匹配:
# 查看AllPlates有但data没有的ID setdiff(AllPlates$ID, data$ID) # 查看data有但AllPlates没有的ID setdiff(data$ID, AllPlates$ID)
如果输出不为空,就可以确认是ID匹配问题导致的异常。
修复方案
- 先清理两个数据框ID列的空白字符,统一类型为字符串:
# 清理空白 AllPlates$ID <- trimws(AllPlates$ID) data$ID <- trimws(data$ID) # 统一类型为字符串 AllPlates$ID <- as.character(AllPlates$ID) data$ID <- as.character(data$ID)
- 重新执行合并,因为
data中的所有ID都存在于AllPlates中,不需要使用全连接,直接使用默认内连接即可得到预期结果:
mergeddata <- merge(data, AllPlates, by = "ID")
内容的提问来源于stack exchange,提问作者Alexander Kim
相关产品推荐
相关产品推荐

