使用dplyr/subset,通过两列进行"不等于"操作筛选

8
这个问题之前可能已经有人回答了,但我无法在任何地方找到它。 我需要使用两列中的值来过滤/子集数据帧以将它们删除。 在这些例子中,我想保留所有行,这些行不等于(!=)复制“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函数是正确的。所以在subsetfilter中出现这种情况很奇怪。无论如何,非常感谢你,我的朋友! :) - Mirko Pavicic
1个回答

12

我认为你想在这里使用"或"条件。看起来像这样:

require(dplyr)

#Create example dataframe
replicate = rep(c(1:3), times = 4)
treatment = rep(c("a","b"), each = 6)

df = data.frame(replicate, treatment)
df %>% 
  filter(replicate != 1 | treatment != "a")

   replicate treatment
1          2         a
2          3         a
3          2         a
4          3         a
5          1         b
6          2         b
7          3         b
8          1         b
9          2         b
10         3         b

1
它像魔法一样奏效。我感到困惑,因为我理解&运算符只有在两个条件都为TRUE时才会返回TRUE,而|运算符只有一个条件为TRUE或两个条件都为TRUE时才会返回TRUE,这对于which函数是正确的。所以在subsetfilter中出现这种情况很奇怪。无论如何,非常感谢你,我的朋友! :) - Mirko Pavicic
1
没问题!在大多数情况下,你是正确的,但是当你指定“不等于”时,例如“!=”,那么你应该使用“或”而不是“和”。 - cody_stinson
此外,如果您觉得你的问题已经得到了解答,请点击勾选标志以关闭它。 - cody_stinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接