如何利用另一数据框的变量值查找替换单元格数值?
批量替换问卷数据中的编码为标签
针对你有数百个变量的大型问卷数据框,无需逐个指定变量名,我们可以用tidyverse工具批量完成编码到标签的替换,仅处理在lookup表中存在的分类变量,数值型变量自动保留原值。
实现代码
library(tidyverse) # 示例数据(你已有的数据框) df_numeric <- tibble::tribble( ~gender, ~age, ~city, ~yearly_income, ~fav_colour, ~over_100_more_vars, 1, 22, 1, 55000, 1, "...", 2, 31, 2, 122000, 2, "...", 1, 41, 1, 101000, 2, "...", 2, 19, 5, 76000, 1, "...", 1, 64, 7, 32000, 6, "...") df_lookup <- tibble::tribble( ~variable, ~number, ~label, "gender", 1, "Male", "gender", 2, "Female", "city", 1, "New York", "city", 2, "Sydney", "city", 5, "London", "city", 7, "Paris", "fav_colour", 1, "Red", "fav_colour", 2, "Blue", "fav_colour", 6, "Purple", "one_of_100_more", 1, "Label", "one_of_100_more", 2, "Label", "two_of_100_more", 1, "Label", "etc", 1, "etc") # 1. 预处理lookup表,生成按变量分组的编码-标签映射列表 lookup_maps <- df_lookup %>% group_split(variable, .keep = FALSE) %>% set_names(map(., ~first(.$variable))) %>% map(~deframe(select(., number, label))) # 2. 获取需要替换的变量(同时存在于数据框和lookup表中的变量) target_vars <- intersect(names(df_numeric), names(lookup_maps)) # 3. 批量替换编码为标签 df_output <- df_numeric %>% mutate(across(all_of(target_vars), ~recode(., !!!lookup_maps[[cur_column()]])))
代码说明
- 预处理lookup表:将原始的lookup长表转换为以变量名为键的列表,每个元素是该变量对应的
编码->标签命名向量,方便后续批量调用。 - 自动识别目标变量:通过
intersect自动找出需要替换的变量,无需手动输入数百个变量名。 - 批量替换:用
across遍历所有目标变量,结合cur_column()动态获取当前处理的变量名,调用对应的映射完成替换。
补充说明
- 如果遇到lookup表中不存在的编码,默认会返回
NA。若需要保留原编码,可修改recode部分:mutate(across(all_of(target_vars), ~recode(., !!!lookup_maps[[cur_column()]], .default = .))) - 数值型变量(如
age、yearly_income)不在lookup表中,会被自动跳过,保持原始数值不变。
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

