`%in%` 和 `==` 有啥区别?
Posted
技术标签:
【中文标题】`%in%` 和 `==` 有啥区别?【英文标题】:What is the difference between `%in%` and `==`?`%in%` 和 `==` 有什么区别? 【发布时间】:2022-01-13 21:32:49 【问题描述】: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 中查看?'=='
和 ?'%in%'
你可能对video number #033感兴趣
【参考方案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 <- 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
【讨论】:
以上是关于`%in%` 和 `==` 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章