Разница между `% in%` и `==`

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% и == здесь?

Ответы

Ответ 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

Все они ЛОЖНЫ. Вы сопоставляете каждые 0,5 с 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}.