基于R语言从NIS数据多诊断列筛选指定ICD码观测
解决NIS数据筛选含J80诊断观测的问题
你之前的代码是用来查询ICD-10诊断标签并生成表格的,和你筛选数据集的需求完全不匹配,自然无法得到想要的结果。以下是两种可行的解决方案,帮你从合并后的2018-2019年NIS数据中,筛选出任意诊断列(I10_DX1至I10_DX40,对应第18至57列)包含J80的观测:
方法1:使用dplyr(tidyverse生态)
这是tidyverse用户常用的简洁写法,需要先加载dplyr包:
library(dplyr) # 假设你的合并后数据集名为nis_data # 方式A:通过列名前缀匹配诊断列 new_nis_data <- nis_data %>% filter(across(starts_with("I10_DX"), ~ .x == "J80") %>% rowSums() > 0) # 方式B:直接指定列位置(第18到57列) new_nis_data <- nis_data %>% filter(across(18:57, ~ .x == "J80") %>% rowSums() > 0)
across(starts_with("I10_DX"), ~ .x == "J80"):对所有以I10_DX开头的列,检查单元格值是否等于J80,返回一个布尔值矩阵rowSums():计算每行中匹配成功的次数,>0表示该行至少有一个诊断列包含J80,从而保留该观测
方法2:使用Base R
如果不想依赖tidyverse包,用原生R代码也能实现:
# 方式A:通过列名匹配诊断列 dx_col_indices <- grep("^I10_DX", colnames(nis_data)) new_nis_data <- nis_data[rowSums(sapply(nis_data[, dx_col_indices], function(x) x == "J80")) > 0, ] # 方式B:直接指定列位置 new_nis_data <- nis_data[rowSums(sapply(nis_data[, 18:57], function(x) x == "J80")) > 0, ]
grep("^I10_DX", colnames(nis_data)):匹配所有以I10_DX开头的列,返回它们的索引sapply(...):对每个诊断列执行值匹配检查,rowSums()统计每行的匹配次数,大于0的行被保留
注意事项
- 确保诊断列是字符类型:如果你的诊断列是因子型,需要先转换为字符型,否则匹配会失败:
# dplyr写法 nis_data <- nis_data %>% mutate(across(starts_with("I10_DX"), as.character)) # Base R写法 nis_data[, dx_col_indices] <- lapply(nis_data[, dx_col_indices], as.character) - 处理大小写问题:如果数据中J80的大小写不统一(比如出现j80),可以统一转换后匹配:
# dplyr写法示例 filter(across(starts_with("I10_DX"), ~ toupper(.x) == "J80") %>% rowSums() > 0)
内容的提问来源于stack exchange,提问作者user44441111
相关产品推荐
相关产品推荐

