多列分别关联crosswalk并统计分类计数的高效实现方法问询
问题解决方案
1. 关联目标变量与crosswalk数据集
无需使用for循环,借助tidyverse工具即可高效完成:
实现步骤:
- 筛选出不含
no_interest的目标变量 - 为每个目标变量生成对应的分类列
- 将分类列与原数据集合并
library(tidyverse) # 模拟数据 df <- data.frame(var1 = c("AC", "AG", "VG", "HH", "AE"), var2_no_interest = c("AF", "FF", NA, NA, NA), var3 = c("AF", "EF", "TT", "ER", NA), var4_no_interest = c("AA", "ER", "AF", "LL", "OP"), var5 = c("HH", "LL", "TT", NA, NA)) crosswalk <- data.frame(Code = c("AG", "HH", "EF", "TT"), Category = c("MBD1", "MBD2", "MBD3", "MBD4")) # 1. 识别目标变量(排除含no_interest的列) target_vars <- names(df)[!str_detect(names(df), "no_interest")] # 2. 生成对应的分类列 category_cols <- map_dfc(target_vars, function(var) { # 提取变量名中的数字,用于命名分类列 var_num <- str_extract(var, "\\d+") # 匹配crosswalk获取分类 df %>% select(all_of(var)) %>% left_join(crosswalk, by = setNames("Code", var)) %>% select(Category) %>% rename(!!paste0("cat_", var_num) := Category) }) # 3. 合并原数据与分类列 merged_df <- bind_cols(df, category_cols)
执行后merged_df将包含原所有变量,以及cat_1、cat_3、cat_5等分类列。
2. 统计各Category出现次数
通过重塑数据格式后统计,无需循环:
# 统计分类出现次数 count_result <- merged_df %>% # 选择所有分类列 select(starts_with("cat_")) %>% # 转换为长格式 pivot_longer(everything(), values_to = "Category") %>% # 去除NA值 drop_na(Category) %>% # 统计次数 count(Category, name = "Counts") %>% # 按分类排序 arrange(Category) print(count_result)
输出结果:
Category Counts 1 MBD1 1 2 MBD2 2 3 MBD3 1 4 MBD4 2
效率说明
- 避免了for循环,使用tidyverse的向量化操作和函数式编程,处理10个目标变量时速度更快且代码更易维护
- 即使数据集变量数量超过100,只要目标变量仅10个,该方法依然高效
内容的提问来源于stack exchange,提问作者shollaback
相关产品推荐
相关产品推荐

