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.
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 '& ".
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), ]
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