用于子集化的%vs%==

时间:2016-09-12 14:35:47

标签: r conditional subset

我在%c()与== c()中使用%来获取一些意外行为来过滤多个条件下的数据。我在== c()方法时返回不完整的结果。这种行为有合理的解释吗?

=IF(ROW(C1)<$E$1,"",AVERAGE(INDEX(C:C,ROW(C1)-$E$1+1):C1))

如果我转换&#39; region&#39;结果不会改变。数字。

1 个答案:

答案 0 :(得分:4)

  

我在== c()方法时返回不完整的结果。有没有   这种行为的逻辑解释?

这是合乎逻辑的,让我们看看:

df$region == 1:2
# [1]  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
 df$region %in% 1:2
# [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE

原因是你试图比较不同长度向量的第一种形式,因为@lukeA在他的评论中说这个形式与(见implementation-of-standard-recycling-rules)相同:

# 1 1 1 2 2 3 3 4 4 4  ## df$region
# 1 2 1 2 1 2 1 2 1 2  ## c(1,2) recycled to the same length
# T F T T F F F F F F  ## equality of the corresponding elements

df$region == c(1,2,1,2,1,2,1,2,1,2)
# [1]  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

操作员左侧的每个值都使用操作员右侧的相应值进行测试。

但是,当你使用df$region %in% 1:2时,它的想法更多:

sapply(df$region, function(x) { any(x==1:2) })
# [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE

我的意思是每个值都针对第二个向量进行测试,如果有一个匹配则返回TRUE。