Ответ 1
Здесь правильный оператор %in%
. Вот пример с фиктивными данными:
set.seed(1)
dat <- data.frame(bf11 = sample(4, 10, replace = TRUE),
foo = runif(10))
даяние:
> head(dat)
bf11 foo
1 2 0.2059746
2 2 0.1765568
3 3 0.6870228
4 4 0.3841037
5 1 0.7698414
6 4 0.4976992
Подмножество dat
, где bf11
равно любому из множества 1,2,3
, берется следующим образом, используя %in%
:
> subset(dat, subset = bf11 %in% c(1,2,3))
bf11 foo
1 2 0.2059746
2 2 0.1765568
3 3 0.6870228
5 1 0.7698414
8 3 0.9919061
9 3 0.3800352
10 1 0.7774452
Что касается того, почему ваш оригинал не работал, сломайте его, чтобы увидеть проблему. Посмотрите, что 1||2||3
оценивает:
> 1 || 2 || 3
[1] TRUE
и вы получите то же самое с помощью |
. В результате вызов subset()
будет возвращать только строки, где bf11
был TRUE
(или что-то, что оценивалось с помощью TRUE
).
То, что вы могли написать, было бы чем-то вроде:
subset(dat, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)
Что дает тот же результат, что и мой предыдущий вызов subset()
. Дело в том, что вам нужна серия одиночных сравнений, а не сравнение ряда опций. Но, как вы можете видеть, %in%
гораздо полезнее и менее подробен в таких обстоятельствах. Также обратите внимание, что я должен использовать |
, поскольку я хочу сравнить каждый элемент bf11
с 1
, 2
и 3
, в свою очередь. Для сравнения:
> with(dat, bf11 == 1 || bf11 == 2)
[1] TRUE
> with(dat, bf11 == 1 | bf11 == 2)
[1] TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE