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

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

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

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

Ответы [ 3 ]

224 голосов
/ 08 февраля 2011
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

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

27 голосов
/ 08 февраля 2011

Вы ищете "|." См. http://cran.r -project.org / doc / manual / R-intro.html # Логические векторы

my.data.frame <- data[(data$V1 > 2) | (data$V2 < 4), ]
13 голосов
/ 18 июня 2015

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

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", точное = 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
...