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

如何筛选包含向量中任意ICD-10编码的数据集行?

嗨Julia!我完全懂你的困扰——用%in%确实只能匹配整列完全等于某个编码的行,而你需要的是只要Codes列里包含goodcodes中的任意一个编码就保留该行对吧?这有两个很实用的方法可以解决:


方法1:用tidyverse工具链(dplyr + stringr)

这是最简洁的方式,先把目标编码向量转成正则表达式的“或”模式,再用字符串检测函数筛选:

library(dplyr)
library(stringr)

# 把goodcodes拼接成正则"或"模式,同时加上单词边界确保匹配完整编码
# 比如会变成 "\\bC11\\b|\\bA14\\b|\\bR17\\b|\\bO80\\b"
pattern <- str_c(str_c("\\b", goodcodes, "\\b"), collapse = "|")

# 筛选符合条件的行
medicalinfo_filtered <- medicalinfo %>%
  filter(str_detect(Codes, pattern))

为什么要加\\b?

这是正则里的单词边界,能保证我们匹配的是独立的编码(比如不会把C11误匹配到C119这类更长的编码里),刚好适配你数据里编码用空格分隔的格式。如果你的编码里有正则特殊字符(比如.),可以把str_detect的匹配逻辑改成固定字符串模式,比如str_detect(Codes, fixed(code))。


方法2:Base R 实现(不用额外包)

如果你不想加载tidyverse,用基础R也能搞定,核心是用grepl遍历检查每个编码:

# 写一个小函数,判断某一行的Codes是否包含任意目标编码
has_target_code <- function(codes_row) {
  # 遍历goodcodes,检查当前行是否有匹配,只要有一个就返回TRUE
  any(sapply(goodcodes, function(code) {
    grepl(paste0("\\b", code, "\\b"), codes_row)
  }))
}

# 用这个函数筛选数据集
medicalinfo_filtered <- medicalinfo[sapply(medicalinfo$Codes, has_target_code), ]

这个逻辑和方法1一致,只是用基础R的函数实现,适合不想引入外部包的场景。


两种方法都能帮你筛选出所有包含goodcodes中任意一个编码的行,测试你的示例数据:

  • 行1包含A14和R17,会被保留
  • 行2包含C11,会被保留
  • 行3没有匹配的编码,会被排除

完全符合你的需求~

内容的提问来源于stack exchange,提问作者Julia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:12:30