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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:10:34