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

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

my.data.frame  2) & (data$V2 < 4), ] 

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

3 Solutions collect form web for “Как объединить несколько условий для подмножества кадра данных с помощью «ИЛИ»?”

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

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

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

Некоторые люди критикуют использование, which не требуется, но это не позволяет значениям NA отбрасывать нежелательные результаты. Эквивалент (не возвращающий 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 

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

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

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

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

 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", exact = FALSE]]

Использование 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 
Давайте будем гением компьютера.