【问题标题】:R: Filtering by two columns using "is not equal" operator dplyr/subsetR:使用“不等于”运算符 dplyr/subset 按两​​列过滤
【发布时间】: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 函数是正确的。太奇怪了,就像subsetfilter 中的那样。不管怎样,非常感谢我的朋友! :)

标签: r dplyr


【解决方案1】:

我认为您希望在这里使用“或”条件。这看起来如何:

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

【讨论】:

  • 它就像一个魅力。我很困惑,因为我理解 & 运算符仅在两个条件都为 TRUE 时才给出 TRUE,而 | 运算符在只有一个条件为 TRUE 或两者都为 TRUE 时给出 TRUE,which 函数也是如此。太奇怪了,就像subsetfilter 中的那样。不管怎样,非常感谢我的朋友! :)
  • 没问题!在大多数情况下您是正确的,但是当您指定“非”时,例如“!=”,那么您会想要使用“或”而不是“和”。
  • 另外,如果您觉得您的问题已得到解答,请继续并点击复选标记将其关闭。
猜你喜欢
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
相关资源
最近更新 更多