2 votes

Filtrer les lignes selon deux critères sur trois

Je veux filtrer un data frame de sorte que je supprime les lignes qui répondent à deux critères sur trois. Mes données ressemblent à ceci :

    df <- structure(list(id = c("032", "033", "018", "052", "031", "072", "019", "071", "068", "999"), 
V1 = c(31.9, 76.3, 62.9, 23.6, 183.4, 114.8, 174.5, 74.9, 239.2, 19), 
V2= c(1.45, 1.03, 0.59, 1.25, 1.11, 1.64, 0.56, 0.64, 1.15, 0.84), 
V3 = c(60, 60, 50, 50, 50, 40, 60, 40, 30, 100)), 
class = "data.frame", row.names = c(NA, -10L))

Je veux supprimer les lignes qui répondent à 2 critères sur 3 des critères suivants :

V1 < 20;

V2 > 1.6;

V3 < 10 ou > 90

Dans cet exemple, la seule entrée correspondante est id = 999.

J'ai essayé de faire cela en configurant une chaîne de filtres pour couvrir toutes les possibilités, comme :

df |> 
filter(V1 > 20 & V2 < 1.6 | V3 > 10 | V3 < 90) |> 
filter(V2 < 1.6 & V1 > 20 | V3 > 10 | V3 < 90) |> 
filter(V3 > 10 | V3 < 90 & V1 > 20 | V2 < 1.6)

Mais les lignes individuelles n'ont pas réussi à filtrer l'id=999, et je me demande aussi s'il existe un moyen de le faire en moins de trois lignes de code?

2voto

Ronak Shah Points 24715

Vous pouvez créer une matrice de ces conditions et utiliser rowSums pour compter combien d'entre elles sont satisfaites.

library(dplyr)

df %>%
  filter(rowSums(cbind(V1 < 20, V2 > 1.6, V3 < 10 , V3 > 90)) < 2)

#   id    V1   V2 V3
#1 032  31.9 1.45 60
#2 033  76.3 1.03 60
#3 018  62.9 0.59 50
#4 052  23.6 1.25 50
#5 031 183.4 1.11 50
#6 072 114.8 1.64 40
#7 019 174.5 0.56 60
#8 071  74.9 0.64 40
#9 068 239.2 1.15 30

Cela signifie de conserver les lignes qui ont moins de 2 conditions satisfaites.

De même, en R de base -

subset(df, rowSums(cbind(V1 < 20, V2 > 1.6, V3 < 10 , V3 > 90)) < 2)

1voto

gladys_c_hugh Points 138
df |>
filer(!(V1 < 20 & V2 > 1.6 | V1 < 20 & (V3 < 10 | V3 > 90) | V2 > 1.6 & (V3 < 10 | V3 > 90)))

Tout d'abord, j'ai créé un filtre qui filtrerait les lignes avec les critères que vous vouliez. Ensuite, j'ai enveloppé cela dans des (parenthèses) et mis un ! devant pour obtenir l'opposé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X