Как объединить несколько условий для подмножества фрейма данных, используя «ИЛИ»?

174

У меня есть data.frame в R. Я хочу попробовать два разных условия для двух разных столбцов, но я хочу, чтобы эти условия были инклюзивными. Поэтому я хотел бы использовать «ИЛИ» для объединения условий. Я использовал следующий синтаксис прежде с большим успехом, когда я хотел использовать условие «И».

my.data.frame <- data[(data$V1 > 2) & (data$V2 < 4), ]

Но я не знаю, как использовать «ИЛИ» в приведенном выше.

Сэм
источник

Ответы:

249
my.data.frame <- subset(data , V1 > 2 | V2 < 4)

Альтернативное решение, которое имитирует поведение этой функции и будет более подходящим для включения в тело функции:

new.data <- data[ which( data$V1 > 2 | data$V2 < 4) , ]

Некоторые люди критикуют использование whichкак ненужное, но оно не дает NAценностям отбрасывать нежелательные результаты. Эквивалент (.ie не возвращающий NA-строки для любых NA в V1 или V2) двум вариантам, показанным выше, без which:

 new.data <- data[ !is.na(data$V1 | data$V2) & ( data$V1 > 2 | data$V2 < 4)  , ]

Примечание: я хочу поблагодарить анонимного участника, который попытался исправить ошибку в приведенном выше коде, исправление, которое было отклонено модераторами. На самом деле была еще одна ошибка, которую я заметил, когда исправлял первую. Условное предложение, которое проверяет значения NA, должно быть первым, если оно должно быть обработано, как я планировал, так как ...

> NA & 1
[1] NA
> 0 & NA
[1] FALSE

Порядок аргументов может иметь значение при использовании '& ".

IRTFM
источник
1
Это вопрос с наибольшим количеством голосов, и затем можно найти: stackoverflow.com/questions/9860090/…
PatrickT
1
Преимущество - компактность и простота понимания. Недостатком является отсутствие полезности в задачах построения функций. Если кто-то хочет повторить это, [нужно обернуть whichили использовать дополнительные !is.naограничения.
IRTFM
Требуется ли «что», и если нет, то почему вы используете его?
Клеб
1
Это не «обязательно», но вы можете получить другой результат, если пропустите which. Если и V1, и V2 являются NA, вы бы получили ряд NA в этой позиции, если не указали which. Я работаю с большими наборами данных, и даже относительно небольшой процент NA действительно заполнит мой экран ненужным выводом. Некоторые люди думают, что это особенность. Я не.
IRTFM
Как вы включаете вызов greplили grepс этим, чтобы также сделать сопоставление с образцом для желаемых строк, в дополнение к этим условным обозначениям ?
user5359531
31

Вы ищете "|." См. Http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors

my.data.frame <- data[(data$V1 > 2) | (data$V2 < 4), ]
ncray
источник
Это НЕ устойчиво к существованию NAs в кадре данных:vc <- data.frame(duzey=factor(c("Y","O","Y","D","Y","Y","O"), levels=c("D","O","Y"), ordered=TRUE), cinsiyet=c("E","E","K",NA,"K","E","K"), yas=c(8,3,9,NA,7,NA,6), Not=c(NA,1,1,NA,NA,2,1)); vc; vc[vc$cinsiyet == "E" | vc$Not < 4,]; vc[vc$cinsiyet == "E" & vc$Not < 2,]
Эрдоган КЕВЕР
17

Для полноты картины мы можем использовать операторы [и [[:

set.seed(1)
df <- data.frame(v1 = runif(10), v2 = letters[1:10])

Несколько вариантов

df[df[1] < 0.5 | df[2] == "g", ] 
df[df[[1]] < 0.5 | df[[2]] == "g", ] 
df[df["v1"] < 0.5 | df["v2"] == "g", ]

df $ name эквивалентно df [["name", точный = ЛОЖЬ]]

Использование dplyr:

library(dplyr)
filter(df, v1 < 0.5 | v2 == "g")

Использование sqldf:

library(sqldf)
sqldf('SELECT *
      FROM df 
      WHERE v1 < 0.5 OR v2 = "g"')

Выход для вышеуказанных опций:

          v1 v2
1 0.26550866  a
2 0.37212390  b
3 0.20168193  e
4 0.94467527  g
5 0.06178627  j
mpalanco
источник
1
как бы вы сделали это для условий 1 И и 3 условий ИЛИ условных, например: my.data.frame <- data [data $ V3> 10 & ((data $ V1> 2) | (data $ V2 <4) | (данные $ V4 <5),]. Когда я делаю это, это не работает
R Guru
1
Вот Это Да! sqldfПакет слишком хорошо. Очень удобно, особенно когда subset()становится немного больно :)
Dawny33