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

如何使用stringr包str_subset函数筛选数据表中符合条件的行

R语言用str_subset筛选数据框行的解决方案

示例数据表CM构造代码如下:

CM<-read.table(header=TRUE,
 stringsAsFactors = FALSE,
 text ="
 subject cmdecod
 001 CARBAMAZEPINE
 001 DOXORUBICIN
 001 CARBAZINE
 001 VINCRISTINE
 002 PILSICAINIDE
 002 PHENOBARBITAL
 002 BUTALBITAL
 002 RIFAP"
 )

你之前用str_detect()的实现是正确的:

CM2 <- filter(CM,str_detect(cmdecod, "RIFAP"))
CM2

为什么str_subset不能直接套用该逻辑

  • str_detect()的返回值是和输入向量等长的逻辑向量,刚好符合dplyr::filter()要求传入行筛选逻辑值的规则。
  • str_subset()的返回值是匹配成功的字符串本身组成的新向量,不是逻辑判断结果,直接放到filter()中无法作为行筛选的判断条件,因此会报错或返回不符合预期的结果。

用str_subset实现需求的两种方案

方案1:结合%in%运算符做逻辑判断

将str_subset()返回的匹配结果作为匹配集合,判断每行的cmdecod是否在该集合中:

library(dplyr)
library(stringr)

CM2 <- filter(CM, cmdecod %in% str_subset(cmdecod, "RIFAP"))
CM2

方案2:通过匹配位置索引筛选行

先拿到匹配行的索引,再直接对数据框做行切片:

library(stringr)

matched_idx <- which(CM$cmdecod == str_subset(CM$cmdecod, "RIFAP"))
CM2 <- CM[matched_idx, ]
CM2

补充优化建议

如果你是需要精确匹配cmdecod等于RIFAP的行,不需要用到正则相关的stringr函数,直接用基础逻辑判断性能更高:

# 写法1:dplyr风格
CM2 <- filter(CM, cmdecod == "RIFAP")
# 写法2:基础R风格
CM2 <- CM[CM$cmdecod == "RIFAP", ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:12:02