【发布时间】:2017-11-08 23:54:04
【问题描述】:
这个问题之前一定已经回答过了,但我在任何地方都找不到。我需要使用两列中的值过滤/子集数据框以删除它们。在示例中,我想保留所有不相等的行(!=)以复制“1”和处理“a”。但是,子集和过滤器函数都删除了所有重复 1 和所有处理 a。我可以通过使用 which 然后索引来解决它,但这不是使用管道运算符的最佳方式。你知道为什么过滤器/子集只有在两个条件都为真时才过滤吗?
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") -
它就像一个魅力。我很困惑,因为我理解
&运算符仅在两个条件都为 TRUE 时才给出 TRUE,而|运算符在只有一个条件为 TRUE 或两者都为 TRUE 的情况下给出 TRUE,这对于which函数是正确的。太奇怪了,就像subset和filter中的那样。不管怎样,非常感谢我的朋友! :)