逻辑运算符未按预期进行子集化

时间:2017-06-07 20:02:07

标签: r boolean-logic

我正在尝试为变量A创建值为1的行的子集,至少一个以下变量创建值1 :B,C或D.

Subset1 <-  subset(Data,
              Data$A==1 &
                Data$B ==1  ||
                Data$C ==1 |
                Data$D == 1,
              select= A)
Subset1

问题是上面的代码返回了一些A = 0的行,我不知道为什么。

麻烦:

  1. 我知道&amp;&amp; || 是长格式或以及将它矢量化。 我已经使用&amp;&amp; || &amp; | 多次运行此代码地方。什么都没有回报我正在寻找的东西。

  2. 当我缩短代码时,它工作正常,我只对我期望的行进行子集化:

  3. Subset1 <- subset(Data, Data$A==1 & Data$B==0, select= A)

    Subset1

    不幸的是,这还不够,因为我还需要捕获C或D值= 1的行。 任何人都可以解释为什么我的第一个代码块没有对我期望的内容进行分组吗?

2 个答案:

答案 0 :(得分:3)

您可以使用parens更具体地了解&所指的内容。否则(正如@Patrick Trentin澄清的那样)你的逻辑运算符根据operator precedence进行组合(在从左到右的相同优先级范围内)。

示例:

> FALSE & TRUE | TRUE #equivalent to (FALSE & TRUE) | TRUE
[1] TRUE
> FALSE & (TRUE | TRUE)
[1] FALSE

因此,在您的情况下,您可以尝试以下内容(假设您需要符合其他条件之一的A == 1 &项目):

Data$A==1 & (Data$B==1 | Data$C==1 | Data$D==1)

答案 1 :(得分:1)

由于你没有提供你正在使用的数据,我在这里复制了一些。

set.seed(20)
Data = data.frame(A = sample(0:1, 10, replace=TRUE),
                  B = sample(0:1, 10, replace=TRUE),
                  C = sample(0:1, 10, replace=TRUE),
                  D = sample(0:1, 10, replace=TRUE))

如果您使用括号,它可以评估逻辑函数,您可以实现您正在寻找的东西。

Subset1 <- subset(Data,
                  Data$A==1 &
                    (Data$B == 1 |
                    Data$C == 1 |
                    Data$D ==1),
                  select=A)
Subset1
  A
1 1
2 1
4 1
5 1