基于转换键将以i10_dx开头的列转换为ccs开头新列
问题
我有一个数据框,包含若干以i10_dx开头的列,需要利用给定的转换键,创建对应的以ccs开头的新列。
示例数据
原数据框
df <- data.frame(visitlink = c(1001976, 1001976, 1002247), i10_dx1 = c("C7931", "C7949", NA), i10_dx2 = c("G9519", "C7951", "C3490"), i10_dx3 = c("G936", "C7931", "C7931"), i10_dx4 = c("C7949", NA, "I10"))
转换键
key <- data.frame(icd10 = c("I10", "C3490", "C7931", "C7949", "C7951", "G936", "G9519"), ccs = c("CIR007", "NEO022", "NEO070", "NEO070", "NEO070", "NVS020", "NVS020"))
解决方案
方法一:使用tidyverse工具链(dplyr + tidyr)
适合需要保持数据宽格式的场景,步骤清晰易读:
library(dplyr) library(tidyr) # 生成ccs对应列 ccs_result <- df %>% # 提取关联列 select(visitlink, starts_with("i10_dx")) %>% # 转长格式以便匹配编码 pivot_longer(cols = starts_with("i10_dx"), names_to = "dx_col", values_to = "icd10") %>% # 匹配转换键中的ccs编码 left_join(key, by = "icd10") %>% # 生成新列名(替换前缀为ccs) mutate(ccs_col = gsub("i10_dx", "ccs", dx_col)) %>% # 转回宽格式 pivot_wider(id_cols = visitlink, names_from = ccs_col, values_from = ccs) # 合并回原数据框 df_final <- df %>% left_join(ccs_result, by = "visitlink")
方法二:基础R循环实现
无需加载额外包,直接用循环处理每一列:
# 筛选所有i10_dx开头的列名 dx_columns <- grep("^i10_dx", colnames(df), value = TRUE) # 循环生成对应ccs列 for (col in dx_columns) { # 构造新列名 new_col <- gsub("i10_dx", "ccs", col) # 匹配编码并赋值 df[[new_col]] <- key$ccs[match(df[[col]], key$icd10)] }
结果说明
处理后的数据框会新增ccs1、ccs2、ccs3、ccs4列,对应原数据中i10_dx1至i10_dx4的编码转换结果,原数据中的NA值会保留在新列中。
内容的提问来源于stack exchange,提问作者ltong
相关产品推荐
相关产品推荐

