R 子集设置时的逻辑条件未给出正确的值

R 子集设置时的逻辑条件未给出正确的值,r,logic,subset,R,Logic,Subset,我想使用逻辑方法对我正在处理的数据帧项目进行子集划分。我得到了一个自相矛盾的结果。ROLL.NO.参数前面的逻辑部分与问题无关。对不起,我不能给出一个可复制的例子。请务必让我知道如何在不显示数据框中相关列的全部393个条目的情况下重现此问题。D14和DC31是简单的整数值,有些值是NA culprits<-project$ROLL.NO.[(project$DC31==1&project$D14==2)|(project$DC31==2&project$D14==1)&a

我想使用逻辑方法对我正在处理的数据帧
项目
进行子集划分。我得到了一个自相矛盾的结果。
ROLL.NO.
参数前面的逻辑部分与问题无关。对不起,我不能给出一个可复制的例子。请务必让我知道如何在不显示数据框中相关列的全部393个条目的情况下重现此问题。
D14
DC31
是简单的整数值,有些值是
NA

 culprits<-project$ROLL.NO.[(project$DC31==1&project$D14==2)|(project$DC31==2&project$D14==1)&!is.na(project$DC31)&!is.na(project$D14)]
culprits
 [1] 3138 3129 3129 3135 3135 3136 3120 3126 3133 3125 3125 3125 3132 3132 3123 3123 3131
 project$HOUSE.NO[(project$DC31==1&project$D14==2)|(project$DC31==2&project$D14==1)&!is.na(project$DC31)&!is.na(project$D14)&project$ROLL.NO.==3131]
[1] "14/132" "14/176" "16/133" "14/111" "14/252"
> project$HOUSE.NO[(project$DC31==1&project$D14==2)|(project$DC31==2&project$D14==1)&!is.na(project$DC31)&!is.na(project$D14)&project$ROLL.NO.==3129]
[1] "14/132" "15/162" "14/176" "16/133" "14/111"
> project$ROLL.NO.[(project$DC31==1&project$D14==2)|(project$DC31==2&project$D14==1)&!is.na(project$DC31)&!is.na(project$D14)&project$ROLL.NO.==3136]
[1] 3129 3136 3120 3123 3123
 project$ROLL.NO.[(project$DC31==1&project$D14==2)|(project$DC31==2&project$D14==1)&!is.na(project$DC31)&!is.na(project$D14)&project$ROLL.NO.==3125]
[1] 3129 3120 3125 3125 3125 3123 3123
project$ROLL.NO.[project$ROLL.NO.==3136]
[1] 3136 3136 3136 3136 3136 3136 3136 3136 3136

?base::Logic
帮助(“&”)
帮助(“|”)

有关这些运算符的优先级,请参见
Syntax
:与许多其他语言(包括S)不同,AND和OR运算符没有相同的优先级(AND运算符的优先级高于OR运算符)

这就解释了为什么

TRUE | TRUE & FALSE
# [1] TRUE
这基本上是

TRUE | (TRUE & FALSE)
这也是正确的,并且简化了您在这里所做的工作:

(project$DC31==1&project$D14==2) |
  (project$DC31==2&project$D14==1) &
  !is.na(project$DC31) &
  !is.na(project$D14) &
  project$ROLL.NO. == 3131
因为您希望结果只包含一些
项目$ROLL.NO.==3131
我假设,因此即使其中一些为假,如果一个或多个
为真,您可能会得到一些不是
的卷。否。
不是
3131


还要注意
的优先级高于来自
?base::Logic
帮助('&')
帮助('|'))
等的逻辑

有关这些运算符的优先级,请参见
Syntax
:与许多其他语言(包括S)不同,AND和OR运算符没有相同的优先级(AND运算符的优先级高于OR运算符)

这就解释了为什么

TRUE | TRUE & FALSE
# [1] TRUE
这基本上是

TRUE | (TRUE & FALSE)
这也是正确的,并且简化了您在这里所做的工作:

(project$DC31==1&project$D14==2) |
  (project$DC31==2&project$D14==1) &
  !is.na(project$DC31) &
  !is.na(project$D14) &
  project$ROLL.NO. == 3131
因为您希望结果只包含一些
项目$ROLL.NO.==3131
我假设,因此即使其中一些为假,如果一个或多个
为真,您可能会得到一些不是
的卷。否。
不是
3131


还要注意
的优先级高于logicals

@rawr添加到问题中。不确定是否包括异常。所以基本上你在做
TRUE | TRUE&FALSE
,你期望这是假的(但它是真的),但你真正想要的是
(TRUE | TRUE)和FALSE
,哪个是假的?为什么前者是真的?来自
?`
有关这些运算符的优先级,请参见?语法:与许多其他语言(包括S)不同,AND和OR运算符的优先级不同(AND运算符的优先级高于OR运算符)。
因此对于
TRUE | TRUE和FALSE
,首先计算
TRUE&FALSE
,表达式变为
TRUE | FALSE
似乎不是,只要指出它,因为你说你有NA,你应该知道它。您需要使用
is.NA测试
NA
,因为
==
将不起作用expected@rawr补充问题。不确定是否包括异常。所以基本上你在做
TRUE | TRUE&FALSE
,你期望这是假的(但它是真的),但你真正想要的是
(TRUE | TRUE)和FALSE
,哪个是假的?为什么前者是真的?来自
?`
有关这些运算符的优先级,请参见?语法:与许多其他语言(包括S)不同,AND和OR运算符的优先级不同(AND运算符的优先级高于OR运算符)。
因此对于
TRUE | TRUE和FALSE
,首先计算
TRUE&FALSE
,表达式变为
TRUE | FALSE
似乎不是,只要指出它,因为你说你有NA,你应该知道它。您需要使用
is.NA测试
NA
,因为
=
将无法按预期工作