[英]What is the difference between `%in%` and `==`?
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%
和==
有什么區別?
問題是矢量回收。
您的第一行完全符合您的期望。 它檢查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 匹配,反之亦然。
在
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}
。
這是一個舊線程,但我沒有在任何地方看到這個答案,它可能與某些人相關。
兩者之間的另一個區別是對 NA(缺失值)的處理。
NA == NA
[1] NA
NA %in% c(NA)
[1] TRUE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.