3
votes

Comment sélectionner des valeurs de colonne en fonction d'une condition supérieure à dans les valeurs de ligne

Je souhaite sélectionner des colonnes dans un bloc de données si l'une des valeurs de la colonne est supérieure à 3.

Dans cet exemple de mtcars , ce critère supprimera vs code> et am , car il n'y a pas de valeur supérieure à 3 dans ces colonnes.

                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2


0 commentaires

3 Réponses :


0
votes

Je pense que

library(dplyr) 
mtcars %>% select_if(~max(.)>3)

fait ce que vous voulez. Si vous voulez une solution tidyverse (puisque vous avez dplyr dans les balises),

## find max val for each column
maxcolval <- apply(mtcars,MARGIN=2,FUN=max)
## select columns
mtcars[maxcolval>3]


0 commentaires

3
votes

Nous pouvons créer un vecteur logique en comparant le dataframe avec 3, puis prendre la somme des colonnes en utilisant colSums et sélectionner uniquement les colonnes qui ont au moins une valeur supérieure à 3.

mtcars[sapply(mtcars, function(x) any(x > 3))]

Variation utilisant sapply

mtcars[colSums(mtcars > 3) > 0]

#                     mpg cyl  disp  hp drat    wt  qsec gear carb
#Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46    4    4
#Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02    4    4
#Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61    4    1
#Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44    3    1
#....


2 commentaires

oups désolé, j'ai remarqué que les données que j'ai sont matricielles, et si j'applique cela, cela ne fonctionne pas .. Mais si je fais ce dataf <- as.data.frame (matrice) et que je l'applique ensuite sur dataf cela fonctionne ... y a-t-il d'autres fonctions que je peux appliquer directement sur Matrix?


@Vlad En cas de matrice, il vous suffit d'ajouter une virgule supplémentaire aux colonnes du sous-ensemble. Par exemple, mat <- as.matrix (mtcars); mat [ colSums (mat> 3)> 0]



1
votes

Avec purrr:

   #                      mpg cyl  disp  hp drat    wt  qsec gear carb
   # Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46    4    4
   # Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02    4    4
   # Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61    4    1
   # Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44    3    1
   # Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02    3    2

Output(truncated):

mtcars[,purrr::map_lgl(mtcars,~any(.x>3))]


0 commentaires