You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:51:31