如何在R中用dplyr filter仅排除指定chr的pos范围行并保留其他数据
问题描述
现有如下示例数据:
df = data.frame(chr = c(1,1,1,2,2,3,3), pos = c(10,15,20,10,14,2,15))
需要使用dplyr的filter()函数实现:仅对chr == 1的行排除pos在1-15范围内的数据,同时保留chr为2、3的所有行。
最初编写的代码如下:
library(dplyr) filter(df, chr == "1" & !pos %in% (1:15))
但执行后仅保留了chr=1且pos=20的行,丢失了chr为2和3的所有数据:
chr pos 1 20
期望得到的输出为:
chr pos 1 20 2 10 2 14 3 2 3 15
解决方法
原代码逻辑存在问题:chr == "1" & !pos %in% 1:15的条件仅保留同时满足chr等于1且pos不在1-15的行,直接过滤掉了所有chr不等于1的记录。
要实现需求,需调整条件逻辑,用逻辑或(|)连接两个有效条件:
- 所有
chr不等于1的行全部保留 chr等于1且pos不在1-15的行保留
对应的正确代码如下:
library(dplyr) filter(df, chr != 1 | !pos %in% 1:15)
也可以写成更直观的拆分形式,逻辑完全一致:
filter(df, (chr == 1 & !pos %in% 1:15) | chr != 1)
注意:原数据中chr是数值类型,无需加引号写成"1",直接使用数值1即可,避免不必要的类型匹配问题。
执行上述代码后,即可得到符合预期的输出结果。
内容的提问来源于stack exchange,提问作者Keith Sanders
相关产品推荐
相关产品推荐

