web-dev-qa-db-fra.com

Comment combiner plusieurs conditions pour sous-définir une trame de données en utilisant "OU"?

J'ai un data.frame dans R. Je veux essayer deux conditions différentes sur deux colonnes différentes, mais je veux que ces conditions soient inclusives. Par conséquent, je voudrais utiliser "OU" pour combiner les conditions. J'ai utilisé la syntaxe suivante auparavant avec beaucoup de succès lorsque je voulais utiliser la condition "AND".

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

Mais je ne sais pas comment utiliser un "OU" dans ce qui précède.

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

Une solution alternative qui imite le comportement de cette fonction et serait plus appropriée pour l'inclusion dans un corps de fonction:

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

Certaines personnes critiquent l'utilisation de which comme non nécessaire, mais cela empêche les valeurs NA de rejeter des résultats indésirables. L'équivalent (.i.e ne retournant pas de lignes NA pour les NA dans V1 ou V2) des deux options présentées ci-dessus sans la which serait:

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

Remarque: je souhaite remercier le contributeur anonyme qui a tenté de corriger l'erreur dans le code ci-dessus, correctif qui a été rejeté par les modérateurs. Il y avait en fait une erreur supplémentaire que j'ai remarquée en corrigeant la première. La clause conditionnelle qui vérifie les valeurs de NA doit être la première si elle doit être traitée comme je le voulais, car ...

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

L'ordre des arguments peut avoir de l'importance lorsque vous utilisez '& ".

226
42-

Vous recherchez "|." Voir http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors

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

Juste pour être complet, nous pouvons utiliser les opérateurs [ et [[:

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

Plusieurs options

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 est équivalent à df [["nom", exact = FALSE]]

Utiliser dplyr:

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

Utiliser sqldf:

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

Sortie pour les options ci-dessus:

          v1 v2
1 0.26550866  a
2 0.37212390  b
3 0.20168193  e
4 0.94467527  g
5 0.06178627  j
13
mpalanco