Подтвердить что ты не робот

Использование нескольких критериев в функции подмножества и логических операторов

Если я хочу выбрать подмножество данных в R, я могу использовать функцию подмножества. Я хотел бы основать анализ данных, которые соответствовали одному из нескольких критериев, например. что определенная переменная была либо 1, 2, либо 3. Я попробовал

myNewDataFrame <- subset(bigfive, subset = (bigfive$bf11==(1||2||3)))

Он всегда просто выбирал значения, которые соответствовали первому из критериев, здесь 1. Мое предположение состояло в том, что оно начиналось с 1, и если оно оценивало значение "ложь", оно продолжало бы до 2, а не до 3, и если ни один не соответствует утверждению после того, как == является "ложным", и если одно из них соответствует, оно "истинно".

Я получил правильный результат, используя

 newDataFrame <- subset(bigfive, subset = (bigfive$bf11==c(1,2,3)))

Но я хотел бы иметь возможность выбирать данные через логические операторы, поэтому: почему первый подход не работал?

4b9b3361

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

Ответ 2

В вашем примере, я считаю, что следующее должно работать:

myNewDataFrame <- subset(bigfive, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)

Подробнее см. примеры в ?subset. Чтобы продемонстрировать, более сложным логическим подмножеством будет:

data(airquality)
dat <- subset(airquality, subset = (Temp > 80 & Month > 5) | Ozone < 40)

И как указывает Chase, %in% будет более эффективным в вашем примере:

myNewDataFrame <- subset(bigfive, subset = bf11 %in% c(1, 2, 3))

Как также указывает Chase, убедитесь, что вы понимаете разницу между | и ||. Чтобы просмотреть страницы справки для операторов, используйте ?'||', где оператор цитируется.