R语言合并Targets与Infantry数据框返回0行结果求助
解决R中merge后返回0行的问题
这种合并后返回0行的情况我之前也碰到过,核心原因就是两个数据集的Port列看起来取值一致,但实际存在隐形差异(比如首尾空格、大小写不一致,或是CSV保存/加载时引入了特殊字符),导致没有能匹配的行。下面给你分步排查和解决的方案:
1. 先排查Port列的实际取值和列名
首先确认两个数据框的Port列是否真的能匹配:
# 查看Targets的Port列唯一值 unique(Targets$Port) # 查看Infantry的Port列唯一值 unique(Infantry$Port) # 同时检查列名是否完全一致(比如有没有多空格) colnames(Targets) colnames(Infantry)
如果输出的取值看起来一样,但合并仍失败,大概率是存在首尾空格——这是CSV加载时很容易出现的隐形问题。
2. 清理Port列的隐形空格
用trimws()函数去掉字符值的首尾空格,再尝试合并:
# 清理两个数据框的Port列 Targets$Port <- trimws(Targets$Port) Infantry$Port <- trimws(Infantry$Port) # 重新执行合并 merged_data <- merge(Targets, Infantry, by = "Port")
3. 处理大小写不一致的情况
如果是大小写问题(比如一个是cartagena,另一个是Cartagena),可以统一转为小写或大写:
# 统一转为小写 Targets$Port <- tolower(Targets$Port) Infantry$Port <- tolower(Infantry$Port) # 执行合并 merged_data <- merge(Targets, Infantry, by = "Port")
4. 强制指定合并列(可选)
如果列名存在细微差异(比如一个是Port,另一个是 Port),可以明确指定by.x和by.y参数:
merged_data <- merge(Targets, Infantry, by.x = "Port", by.y = "Port")
测试验证
为了确保方法有效,你可以先构造无差异的测试数据验证合并逻辑:
# 构造测试用的Targets数据框 Targets <- data.frame( Port = c("Cartagena", "Porto Bello", "Havana", "Panama City"), Population = c(35000, 49000, 140000, 105000), Worth = c(10000, 15000, 50000, 35000), stringsAsFactors = FALSE ) # 构造测试用的Infantry数据框 Infantry <- data.frame( Port = c("Porto Bello", "Cartagena", "Panama City", "Havana"), Infantry = c(700, 500, 1500, 2000), stringsAsFactors = FALSE ) # 执行合并,此时应该得到正确结果 merge(Targets, Infantry)
内容的提问来源于stack exchange,提问作者St. Lazarus
相关产品推荐
相关产品推荐

