Jak połączyć wiele warunków, aby podzestawić ramkę danych za pomocą "OR"?

Mam dane.ramka w R. chcę wypróbować dwa różne warunki na dwóch różnych kolumnach, ale chcę, aby te warunki były włącznie. Dlatego chciałbym użyć "lub", aby połączyć warunki. Używałem już z dużym powodzeniem poniższej składni, gdy chciałem użyć warunku "i".

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

Ale nie wiem, jak używać 'OR' w powyższym.

Author: Donnied, 2011-02-08

3 answers

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

Alternatywne rozwiązanie, które naśladuje zachowanie tej funkcji i byłoby bardziej odpowiednie do włączenia do ciała funkcji:

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

Niektórzy krytykują użycie which jako niepotrzebne, ale zapobiega to odrzuceniu niechcianych wyników przez wartości NA. Odpowiednik (.nie zwracając wierszy NA dla dowolnych NA W V1 lub V2) do dwóch opcji pokazanych powyżej bez which byłoby:

 new.data <- data[ !is.na(data$V1 | data$V2) & ( data$V1 > 2 | data$V2 < 4)  , ]

Uwaga: chcę podziękować anonimowemu współpracownikowi to próbowało naprawić błąd w kodzie bezpośrednio powyżej, poprawka, która została odrzucona przez moderatorów. W rzeczywistości był dodatkowy błąd, który zauważyłem, gdy poprawiałem pierwszy. Klauzula warunkowa, która sprawdza wartości NA, musi być pierwsza, jeśli ma być traktowana tak, jak zamierzałem, ponieważ ...

> NA & 1
[1] NA
> 0 & NA
[1] FALSE

Kolejność argumentów może mieć znaczenie przy użyciu'&".

 201
Author: 42-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-07 16:08:19

Szukasz"/."Zobacz http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors

my.data.frame <- data[(data$V1 > 2) | (data$V2 < 4), ]
 25
Author: ncray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-08 16:21:53

Dla kompletności możemy użyć operatorów [ i [[:

set.seed(1)
df <- data.frame(v1 = runif(10), v2 = letters[1:10])

Kilka opcji

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 jest odpowiednikiem df [["name", exact = FALSE]]

Używając dplyr:

library(dplyr)
filter(df, v1 < 0.5 | v2 == "g")

Używając sqldf:

library(sqldf)
sqldf('SELECT *
      FROM df 
      WHERE v1 < 0.5 OR v2 = "g"')

Wyjście dla powyższych opcji:

          v1 v2
1 0.26550866  a
2 0.37212390  b
3 0.20168193  e
4 0.94467527  g
5 0.06178627  j
 12
Author: mpalanco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-24 10:19:31