R语言处理混存国家与城市的列:为城市匹配对应国家
解决方法:用tidyverse填充并过滤数据
别担心,既然你已经能区分哪些行是国家、哪些是城市,那剩下的操作其实非常直观!咱们用R里的tidyverse工具链就能快速得到你想要的结果。
步骤1:回顾你的原始数据
先确认下你的初始数据结构(用你提供的示例):
library(tibble) countries <- tibble( city = c('Belgium', 'Bruxelles', 'Antwerpen', 'Bulgaria', 'Sofia', 'Plovdiv') )
步骤2:整合你的标记逻辑
假设你已经有了判断国家行的逻辑(比如生成了一个is_country列,TRUE代表这一行是国家名称),先把这个标记列加到数据框里:
library(dplyr) # 这里替换成你实际的标记逻辑,比如你可能用了正则/预设列表来判断 countries <- countries %>% mutate(is_country = city %in% c('Belgium', 'Bulgaria'))
步骤3:填充国家名称并过滤
接下来是核心操作:先把国家行的名称赋值给新的country列,然后用fill()把这个值向下填充到后续的城市行,最后过滤掉原来的国家行即可:
library(tidyr) final_result <- countries %>% # 给国家行的country列赋值,非国家行暂时设为NA mutate(country = ifelse(is_country, city, NA)) %>% # 向下填充country列的NA值,用最近的上方国家名称覆盖 fill(country, .direction = "down") %>% # 只保留城市行,去掉原来的国家行 filter(!is_country) %>% # 调整列顺序,让city在前,country在后 select(city, country)
最终结果
运行完上面的代码后,你会得到想要的数据框:
print(final_result) # # A tibble: 4 × 2 # city country # <chr> <chr> # 1 Bruxelles Belgium # 2 Antwerpen Belgium # 3 Sofia Bulgaria # 4 Plovdiv Bulgaria
小提示
如果你的国家判断逻辑不是用%in%,而是其他方式(比如正则匹配国家名称的特征),只需要替换mutate(is_country = ...)里的逻辑就行,核心的填充和过滤步骤完全通用。
内容的提问来源于stack exchange,提问作者petyar
相关产品推荐
相关产品推荐

