Как объединить несколько условий для подмножества кадра данных с помощью "ИЛИ"?
У меня есть data.frame в R. Я хочу попробовать два разных условия для двух разных столбцов, но я хочу, чтобы эти условия были инклюзивными. Поэтому я хотел бы использовать "ИЛИ" для объединения условий. Я использовал следующий синтаксис раньше с большим успехом, когда я хотел использовать условие "И".
my.data.frame <- data[(data$V1 > 2) & (data$V2 < 4), ]
Но я не знаю, как использовать "OR" в приведенном выше.
Ответы
Ответ 1
my.data.frame <- subset(data , V1 > 2 | V2 < 4)
Альтернативное решение, которое имитирует поведение этой функции и было бы более подходящим для включения в тело функции:
new.data <- data[ which( data$V1 > 2 | data$V2 < 4) , ]
Некоторые люди критикуют использование which
как не нужное, но это не позволяет значениям NA
отбрасывать нежелательные результаты. Эквивалент (.i.e, не возвращающий 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
Порядок аргументов может иметь значение при использовании "&".
Ответ 2
Вы ищете "|". См. http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors
my.data.frame <- data[(data$V1 > 2) | (data$V2 < 4), ]
Ответ 3
Для полноты мы можем использовать операторы [
и [[
:
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