R中逻辑子集的原因不匹配

时间:2016-04-13 09:25:32

标签: r subset logical-operators

我是R的初学者。我一直在使用数据框(名为df1)。 HOUSE. NO , E1, D11, DC11是框架中的各种列名。以下是我执行的逻辑子集的结果。

   df1
   HOUSE.NO D11 DC11 E1
75   16/215   2    2 NA
76   15/262   1    1  2
77   16/220   1    1  2
78    14/13   1    1  1
79     14/9   2    2 NA
df1$HOUSE.NO[df1$E1==1&any(!df1$D11==1,!df1$DC11==1)]
[1] NA      "14/13" NA 

但是对于“14/13”值,当我单独计算逻辑的值时,它出现了FALSE

df1$E1[df1$HOUSE.NO=="14/13"]==1&any(df1$D11[df1$HOUSE.NO=="14/13"]!=1, df1$DC11[df1$HOUSE.NO=="14/13"]!=1)
[1] FALSE

我无法看到这是怎么发生的。我还独立检查了数据框架,它是错误的。请让我知道为什么会这样。

1 个答案:

答案 0 :(得分:1)

我认为你观察到的是any适用于整个向量而==应用于向量的每个元素。

例如:

e1 <- c(1, 1, 1)
d11 <- c(1, 2, 2)
dc11 <- c(1, 1, 2)
house <- c("14/13", "a", "b", "c")

当你测试这个

house[e1==1 & any(d11!=1, dc11!=1) ]
据说所有房屋都符合条件,这是正确的。但是当你仔细看看14/13的门牌号时,它的E1确定等于1,但它的D11和DC11都等于1.那是因为在比较集中在这个房子上,特别是那里any比较中没有其他房子通过&#34; any&#34;测试

换句话说:any(d11!=1, dc11!=1)在应用于所有房屋时返回单个TRUE因为(在我们的两个示例中)至少有房屋,D11或DC11不等于1。您将此单TRUE与一个布尔向量(此处为c(TRUE, TRUE, TRUE))与&结合使用,它会返回向量c(TRUE & TRUE, TRUE & TRUE, TRUE & TRUE)

现在,如果您对门牌号码&#34; 14/13&#34;进行操作,您将运行(any部分)any(d11[house=="14/13"]!=1, dc11[house=="14/13"]!=1)并获取FALSE。< / p>

总之,您要运行的命令是

house[ e1[house=="14/13"]]==1 & any(d11!=1, dc11!=1) ]

而不是

house[ e1[house=="14/13"]]==1 & 
    any(d11[house=="14/13"]!=1, dc11[house=="14/13"]!=1) ]