使用left_join()合并GEM、Hofstede、GPS国家数据集的正确性咨询
数据集合并优化方案
你现有的合并逻辑整体是正确的,核心思路(统一用ISO3作为主键关联三个数据集)是合理的,以下是可优化的点和完整实现方案:
现有逻辑的可改进点
- 未做ISO3编码匹配校验:
countrycode转换国家名时可能因为别名、拼写差异出现匹配失败生成NA,需要提前排查修正 - 未处理无效占位符:三个数据集里的
.属于无效占位值,直接合并会被误认为有效编码,需要提前替换为NA并过滤 - 未做结果校验:合并后缺少匹配成功率的统计,无法确认多少国家实现了完整关联
- 未处理重复列名:Hofstede和GPS都有
country字段,直接合并会自动加后缀混淆,可提前规范命名
优化后完整代码
library(dplyr) library(countrycode) # 1. 预处理GEM数据集 clean_GemData <- new_GemData %>% # 替换cntry列的无效.为NA mutate(cntry = na_if(cntry, ".")) %>% # 过滤无有效ISO3编码的行 filter(!is.na(cntry)) # 2. 预处理Hofstede数据集 clean_Hofstede <- new_Hofstede %>% # 所有列的无效.替换为NA mutate(across(everything(), ~na_if(.x, "."))) %>% # 转换国家名到ISO3编码 mutate(iso3 = countrycode(country, origin = "country.name", destination = "iso3c")) # 打印匹配失败的国家,可手动补全编码 cat("Hofstede中ISO3匹配失败的国家列表:\n") print(clean_Hofstede %>% filter(is.na(iso3)) %>% select(country)) # 3. 预处理GPS数据集 clean_GpsData <- new_GpsData %>% # 统一ISO3编码为大写,避免大小写不匹配 mutate(isocode = toupper(isocode)) %>% # 重命名主键方便合并 rename(iso3 = isocode, country_gps = country) # 4. 合并数据集 # 若需要保留所有三个数据集的国家,把left_join替换为full_join即可 all_data <- clean_Hofstede %>% left_join(clean_GemData, by = c("iso3" = "cntry")) %>% left_join(clean_GpsData, by = "iso3") # 5. 合并结果校验 cat("合并后总有效行数:", nrow(all_data %>% filter(!is.na(iso3))), "\n") cat("三个数据集全部匹配成功的国家数:", nrow(all_data %>% filter(!is.na(all_tea) & !is.na(patience))), "\n")
额外优化建议
- 遇到匹配失败的国家,可以给
countrycode加custom_match参数自定义匹配规则,比如custom_match = c("朝鲜" = "PRK") - 如果需要指定重复列的后缀,可以在join时加
suffix参数,比如left_join(clean_GpsData, by = "iso3", suffix = c("_hofstede", "_gps")) - 若后续需要剔除匹配不完整的行,可以加
filter(!is.na(all_tea), !is.na(patience))过滤
内容的提问来源于stack exchange,提问作者Liam
相关产品推荐
相关产品推荐

