这个问题之前可能已经有人回答了,但我无法在任何地方找到它。 我需要使用两列中的值来过滤/子集数据帧以将它们删除。 在这些例子中,我想保留所有行,这些行不等于(!=)复制“1”和处理“a”。 然而,无论是subset还是filter函数都会删除所有复制品1和所有治疗a。 我可以通过使用which然后索引来解决它,但这并不是使用管道运算符的最佳方法。 你知道为什么filter / subset不仅在两个条件都为真时才进行过滤吗?
require(dplyr)
#Create example dataframe
replicate = rep(c(1:3), times = 4)
treatment = rep(c("a","b"), each = 6)
df = data.frame(replicate, treatment)
#filtering data
> filter(df, replicate!=1, treatment!="a")
replicate treatment
1 2 b
2 3 b
3 2 b
4 3 b
> subset(df, (replicate!=1 & treatment!="a"))
replicate treatment
8 2 b
9 3 b
11 2 b
12 3 b
#solution by which - indexing
index = which(df$replicate==1 & df$treatment=="a")
> df[-index,]
replicate treatment
2 2 a
3 3 a
5 2 a
6 3 a
7 1 b
8 2 b
9 3 b
10 1 b
11 2 b
12 3 b
|
代替&
。过滤条件默认使用&
进行组合。示例代码:filter(df, replicate!=1 | treatment!="a")
。 - Psidom&
运算符只有在两个条件都为TRUE时才会返回TRUE,而|
运算符只有一个条件为TRUE或两个条件都为TRUE时才会返回TRUE,这对于which
函数是正确的。所以在subset
和filter
中出现这种情况很奇怪。无论如何,非常感谢你,我的朋友! :) - Mirko Pavicic