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
相关产品推荐
相关产品推荐

