R中如何基于目标ICD9编码匹配行并新增neuro标识列
问题原因排查
- 数据类型不匹配:你的ICD9列都是字符型(
<chr>),但你定义的目标编码是数值型,类型不一致导致匹配失效。
- 数据类型不匹配:你的ICD9列都是字符型(
- 向量构造语法错误:
c(320:337, 339:359 and 430:438)是无效写法,R中拼接多个向量使用逗号分隔,不应使用and。
- 向量构造语法错误:
- 第一种方法逻辑错误:for循环中的
i是列索引(取值为2、3……ncol(df)),你拿列索引和ICD编码值匹配,自然返回全0。
- 第一种方法逻辑错误:for循环中的
- 第二种方法逻辑错误:
df == x是将整个数据框和向量x逐一比较,而非判断每行元素是否存在于x中,逻辑完全不匹配。
- 第二种方法逻辑错误:
正确解决方案
方法1:tidyverse(推荐,代码简洁易读)
使用dplyr的if_any函数,专门用于判断多列中是否有任意一列满足条件:
library(dplyr) # 构造目标ICD编码,转为字符型和数据类型匹配 target_icd <- as.character(c(320:337, 339:359, 430:438)) df <- df %>% mutate( # 选中所有ICD9开头的列,判断任意列值在目标编码中,转成1/0标识 neuro = as.integer(if_any(starts_with("ICD9"), ~ .x %in% target_icd, na.rm = TRUE)) )
方法2:base R
# 构造目标ICD编码 target_icd <- as.character(c(320:337, 339:359, 430:438)) # 提取所有ICD9列(示例数据中为第2到第10列) icd_columns <- df[, 2:10] # 逐行判断是否存在目标编码,转成1/0 df$neuro <- as.integer(apply(icd_columns, 1, function(row) any(row %in% target_icd, na.rm = TRUE)))
结果验证
针对你给出的示例数据集,运行后neuro列结果如下:
| ID | neuro |
|---|---|
| 20002038 | 0 |
| 20003011 | 0 |
| 20003019 | 1 |
| 20003026 | 0 |
| 20004018 | 1 |
| 20007016 | 1 |
和预期完全一致:包含320、436、339的行均被标识为1。
内容的提问来源于stack exchange,提问作者existential_dread
相关产品推荐
相关产品推荐

