如何使用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
相关产品推荐
相关产品推荐

