R语言中如何按列值匹配条件排除数据框的指定行
R语言按条件排除meta_CD数据框指定行实现方法
实现时需注意空值NA的判断逻辑:直接使用==做值比较时,只要任意一侧为NA就会返回NA结果,容易导致行误删,因此判断相等前需要先排除NA值的干扰。
排除规则对应逻辑
- 规则A:只要
imm1/imm2任意一列的非NA取值,和bio1/bio2任意一列的取值相等,就排除对应行 - 规则B:只要
imm1/imm2任意一列的非NA取值,和surg列的取值相等,就排除对应行
具体实现代码
基础R实现(无需安装加载第三方包)
# 标记命中规则A的行 hit_ruleA <- with(meta_CD, (!is.na(imm1) & (imm1 == bio1 | imm1 == bio2)) | (!is.na(imm2) & (imm2 == bio1 | imm2 == bio2)) ) # 标记命中规则B的行 hit_ruleB <- with(meta_CD, (!is.na(imm1) & imm1 == surg) | (!is.na(imm2) & imm2 == surg) ) # 保留未命中任何排除规则的行 meta_CD_clean <- meta_CD[!(hit_ruleA | hit_ruleB), ]
用提供的示例数据运行上述代码,会自动排除第1、2行,保留符合要求的第3、4行,结果符合预期。
dplyr实现(适合tidyverse工作流)
如果日常使用dplyr做数据处理,可以用以下更简洁的语法:
library(dplyr) meta_CD_clean <- meta_CD %>% filter( # 过滤规则A命中行 !((!is.na(imm1) & imm1 %in% c(bio1, bio2)) | (!is.na(imm2) & imm2 %in% c(bio1, bio2))), # 过滤规则B命中行 !((!is.na(imm1) & imm1 == surg) | (!is.na(imm2) & imm2 == surg)) )
注意:不要省略
!is.na()的判断步骤,否则当比较列存在NA值时,会出现行误删的问题。
内容的提问来源于stack exchange,提问作者Sharmili Balarajah
相关产品推荐
相关产品推荐

