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

R语言处理维基百科世界幸福报告数据:去除国家名称重复

解决R抓取维基表格后国家列名称重复的问题

问题背景

抓取德语维基百科的World Happiness Report表格后,Land列出现重复的国家名称(如"China China"),尝试两种基于str_split的处理方法未得到预期结果:

  • 使用lapply处理后,Land列显示为列表类型(<chr [1]>),实际值仍重复
  • 直接取str_split结果的第一个元素的唯一值,导致整列被赋值为第一个国家的名称

原因分析

  • 第一种方法返回的是列表对象,未转换为字符向量,因此DataFrame列类型异常
  • 第二种方法仅处理了第一个元素的拆分结果,未遍历整个列

有效解决方案

以下是针对不同场景的处理方法,优先推荐能兼容多空格国家名称的方案:

方案1:正则替换重复模式

适用于所有"名称 名称"格式的重复,包括含空格的国家名(如"Saudi Arabia Saudi Arabia"):

df$Land <- str_replace(df$Land, "(.*) \\1", "\\1")

原理:匹配"内容 内容"的重复模式,将其替换为第一个捕获组(即原始名称)

方案2:拆分后取唯一值再合并

同样兼容含空格的国家名,处理逻辑更直观:

df$Land <- sapply(df$Land, function(x) {
  parts <- str_split(x, " ")[[1]]
  paste(unique(parts), collapse = " ")
})

原理:对每个字符串按空格拆分,提取唯一部分后重新合并为完整名称

方案3:取拆分后的第一部分(仅适用于无空格的国家名)

如果确认所有国家名称均为单个单词,可快速提取第一部分:

df$Land <- str_split_fixed(df$Land, " ", n = 2)[, 1]
# 或使用word函数
df$Land <- word(df$Land, 1)

验证示例

以重复的多单词国家名测试:

test_str <- "Saudi Arabia Saudi Arabia"
str_replace(test_str, "(.*) \\1", "\\1") 
# 返回 "Saudi Arabia"(正确)

sapply(test_str, function(x) paste(unique(str_split(x, " ")[[1]]), collapse = " "))
# 返回 "Saudi Arabia"(正确)

str_split_fixed(test_str, " ", 2)[,1]
# 返回 "Saudi"(错误,仅适用于单单词国名)

内容的提问来源于stack exchange,提问作者AlexisR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:09:24