为了账号安全,请及时绑定邮箱和手机立即绑定

%in%和==之间的差异

%in%和==之间的差异

动漫人物 2019-10-21 12:42:08
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.0df[df$time == c(0.5, 3), ]##     x time## 1   1  0.5## 7   7  0.5## 10 10  3.0%in%和==这里和有什么不一样?
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

问题是向量回收。


您的第一行完全符合您的期望。它检查什么的元素df$time都在c(0.5, 3),并返回它们的值。


您的第二行比较棘手。实际上等于


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

看到这一点,让我们看看使用vector会发生什么rep(0.5, 10):


rep(0.5, 10) == c(0.5, 3)

[1]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE

查看它如何返回每个奇数值。本质上它与向量匹配0.5c(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

他们都是假的。您将每0.5匹配3,反之亦然。


查看完整回答
反对 回复 2019-10-21
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞


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}。


查看完整回答
反对 回复 2019-10-21
?
莫回无

TA贡献1865条经验 获得超7个赞

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


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


NA == NA

[1] NA

NA %in% c(NA)

[1] TRUE


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 778 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信