【问题标题】:What is the difference between `%in%` and `==`?`%in%` 和 `==` 有什么区别?
【发布时间】:2013-02-27 18:37:18
【问题描述】:
df <- structure(list(x = 1:10, time = c(0.5, 0.5, 1, 2, 3, 0.5, 0.5, 
1, 2, 3)), .Names = c("x", "time"), row.names = c(NA, -10L), class = "data.frame")


df[df$time %in% c(0.5, 3), ]
##     x time
## 1   1  0.5
## 2   2  0.5
## 5   5  3.0
## 6   6  0.5
## 7   7  0.5
## 10 10  3.0

df[df$time == c(0.5, 3), ]
##     x time
## 1   1  0.5
## 7   7  0.5
## 10 10  3.0

%in%== 这里有什么区别?

【问题讨论】:

标签: r


【解决方案1】:

问题在于矢量回收。

您的第一行完全符合您的预期。它检查df$time 的哪些元素在c(0.5, 3) 中并返回它们的值。

您的第二行比较棘手。它实际上相当于

df[df$time == rep(c(0.5,3), length.out=nrow(df)),]

要看到这一点,让我们看看如果使用矢量rep(0.5, 10) 会发生什么:

rep(0.5, 10) == c(0.5, 3)
[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE

看看它是如何返回每个奇数的。本质上它匹配 0.5 到向量 c(0.5, 3, 0.5, 3, 0.5...)

您可以通过这种方式操作向量以不产生匹配项。取矢量:rep(c(3, 0.5), 5):

rep(c(3, 0.5), 5) == c(0.5, 3)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

他们都是FALSE;您将每 0.5 与 3 匹配,反之亦然。

【讨论】:

  • 得到它总是使用%in% 除非我比较一个独特的价值或实际上打算使用回收,非常清楚谢谢 +
  • @user1320502 实际上,即使只有一个值,使用 %in% 也有一些优势。尝试x &lt;- c(1:5, rep(NA, 3)); x[x==3] 并将其与x[x%in%3] 进行比较。
【解决方案2】:

df$time == c(0.5,3)

c(0.5,3) 首先被广播成df$time 的形状,即c(0.5,3,0.5,3,0.5,3,0.5,3,0.5,3)。然后逐个元素地比较这两个向量。

另一方面,

df$time %in% c(0.5,3)

检查df$time的每个元素是否属于集合{0.5, 3}

【讨论】:

    【解决方案3】:

    这是一个旧线程,但我在任何地方都没有看到这个答案,它可能与某些人有关。

    两者之间的另一个区别是处理 NA(缺失值)。

    NA == NA
    [1] NA
    NA %in% c(NA)
    [1] TRUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      相关资源
      最近更新 更多