Как объединить несколько условий для подмножества фрейма данных с помощью "или"?
У меня есть сведения.я хочу попробовать два разных условия на двух разных столбцах, но я хочу, чтобы эти условия были включительными. Поэтому я хотел бы использовать "или" для объединения условий. Я использовал следующий синтаксис раньше с большим успехом, когда я хотел использовать условие "и".
my.data.frame <- data[(data$V1 > 2) & (data$V2 < 4), ]
но я не знаю, как использовать 'или' в выше.
3 ответа:
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 is эквивалентно 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