Как объединить несколько условий для подмножества фрейма данных с помощью "или"?
У меня есть сведения.я хочу попробовать два разных условия на двух разных столбцах, но я хочу, чтобы эти условия были включительными. Поэтому я хотел бы использовать "или" для объединения условий. Я использовал следующий синтаксис раньше с большим успехом, когда я хотел использовать условие "и".
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