#r #vector #boolean
#r
Вопрос:
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. Смотрите
?'=='
и?'%in%'
в R2. возможно, вас заинтересует номер видео # 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 и наоборот.
Комментарии:
1. получите его всегда
%in%
, если я не сравниваю одно уникальное значение ИЛИ на самом деле не собираюсь использовать переработку, очень ясно, спасибо2. @user1320502 На самом деле, есть некоторые преимущества в использовании%в%, даже если у вас есть одно значение. Попробуйте
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:
Это старая тема, но я нигде не видел этого ответа, и это может быть актуально для некоторых людей.
Еще одно различие между ними заключается в обработке NAs (пропущенных значений).
NA == NA
[1] NA
NA %in% c(NA)
[1] TRUE