2 votes

Filtrer sur plusieurs colonnes à la fois dans `dplyr`.

Voici quelques exemples de données

library(tidyverse)

data <- matrix(runif(20), ncol = 4) 
colnames(data) <- c("mt100", "cp001", "cp002", "cp003")
data <- as_tibble(data)

L'ensemble de données réel comporte beaucoup plus de colonnes, mais il s'avère que de nombreuses colonnes commencent toutes par "cp". Dans dplyr Je peux sélectionner toutes ces colonnes

data %>%
  select(starts_with("cp"))

Existe-t-il un moyen d'utiliser l'outil d'évaluation de la qualité de l'eau ? starts_with (ou une fonction similaire) pour filtrer sur plusieurs colonnes sans avoir à les écrire toutes explicitement ? Je pense à quelque chose comme ceci

data %>%
  filter(starts_with("cp") > 0.2)

Gracias.

6voto

TarJae Points 9674

Nous pourrions utiliser if_all ou if_any comme le souligne Anil dans ses commentaires : Pour votre code, ce serait :

https://www.tidyverse.org/blog/2021/02/dplyr-1-0-4-if-any/

if_any() et if_all()

"across() est très utile au sein de summarise() et mutate(), mais il est difficile de l'utiliser avec filter() car la manière dont les résultats seraient combinés en un seul vecteur logique n'est pas claire. Pour combler cette lacune, nous introduisons donc deux nouvelles fonctions if_all() et if_any()."

si_tout

data %>% 
  filter(if_all(starts_with("cp"), ~ . > 0.2))

  mt100 cp001 cp002 cp003
  <dbl> <dbl> <dbl> <dbl>
1 0.688 0.402 0.467 0.646
2 0.663 0.757 0.728 0.335
3 0.472 0.533 0.717 0.638

si_tout :

data %>% 
  filter(if_any(starts_with("cp"), ~ . > 0.2))

  mt100 cp001   cp002 cp003
  <dbl> <dbl>   <dbl> <dbl>
1 0.554 0.970 0.874   0.187
2 0.688 0.402 0.467   0.646
3 0.658 0.850 0.00813 0.542
4 0.663 0.757 0.728   0.335
5 0.472 0.533 0.717   0.638

5voto

Gregor Points 6270

Vous pouvez utiliser dplyr::across() ainsi qu'une fonction anonyme de type purrr :

data %>%
  filter(across(starts_with("cp"), ~ . > .2))
# # A tibble: 3 × 4
#   mt100 cp001 cp002 cp003
#   <dbl> <dbl> <dbl> <dbl>
# 1 0.628 0.604 0.802 0.501
# 2 0.744 0.283 0.702 0.493
# 3 0.279 0.372 0.975 0.751

(Notez que sans un set.seed() nos résultats seront différents en raison du RNG).

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