如何使用命名列表替换数据框列中的城市名称值
用purrr结合命名列表替换城市全称到缩写
嘿,这个需求用purrr结合命名列表完全能轻松实现!我给你拆解一下具体实现思路和代码示例:
首先,先明确你的命名列表结构:你给出的示例city_names_short <- list("ANA" = "Anaheim", "BOS" = "Boston")是缩写作为键,全称作为值,我们的目标是把数据框里的全称替换成对应的缩写键。
步骤1:准备测试环境和数据
先加载需要的包,构造测试数据框:
library(tidyverse) # 包含dplyr和purrr,处理数据框更方便 # 你的命名列表:键=缩写,值=全称 city_names_short <- list("ANA" = "Anaheim", "BOS" = "Boston", "CHI" = "Chicago") # 测试用的数据框,包含一些城市全称,还有一个不在列表里的城市 df <- tibble(city = c("Anaheim", "Boston", "Chicago", "New York", "Boston"))
步骤2:用purrr::map_chr()实现替换
这里有两种常用的写法,都能达到目的:
写法一:直接遍历匹配
利用purrr::keep()筛选出匹配的列表元素,再提取对应的缩写键:
df <- df %>% mutate(city_abbr = map_chr(city, ~{ # 找到列表中值等于当前城市的元素,再取它的键(也就是缩写) matched_abbr <- names(keep(city_names_short, .x == .)) # 有匹配就返回缩写,没匹配就返回原城市名(也可以改成NA_character_) if (length(matched_abbr) > 0) matched_abbr else .x }))
写法二:先反转列表,再快速映射
如果你的数据量比较大,先把命名列表反转(让全称当键,缩写当值),匹配会更高效:
# 反转列表:把原列表的键值对调换,转成字符向量 city_name_map <- inv_map(city_names_short) %>% flatten_chr() # 用map_chr快速映射,%||%处理无匹配的情况(返回原名称) df <- df %>% mutate(city_abbr = map_chr(city, ~city_name_map[[.x]] %||% .x))
结果展示
运行完上面的代码后,你的数据框会新增一列city_abbr,内容如下:
| city | city_abbr |
|---|---|
| Anaheim | ANA |
| Boston | BOS |
| Chicago | CHI |
| New York | New York |
| Boston | BOS |
小提示
- 如果你的命名列表是全称当键,缩写当值(比如
list("Anaheim" = "ANA")),那可以直接跳过反转步骤,直接用map_chr(city, ~city_names_short[[.x]] %||% .x)。 - 如果你希望无匹配的城市返回NA而不是原名称,把
%||% .x改成%||% NA_character_就行。
内容的提问来源于stack exchange,提问作者Luke Steer
相关产品推荐
相关产品推荐

