2 votes

Un moyen efficace de filtrer uniquement les premières lignes où la condition est remplie ?

Supposons que j'ai un cadre de données comme,

library(dplyr)

data <- tibble(
   label = c("a","a","b","a","c","c","a")
)
data$index <- 1:nrow(data)

Je ne veux pas sous-ensembler toutes les lignes où label == "a" mais seulement le premiers rangs où cela est vrai .

Dans l'exemple, je voudrais les deux premières lignes :

  label index
  <chr> <int>
1 a         1
2 a         2

car à la ligne suivante, l'étiquette est "b". Toutes les lignes suivantes où l'étiquette == "a" doivent être ignorées.

J'ai mis en place une solution peu élégante avec une boucle for, mais il existe sûrement un moyen efficace de filtrer de la sorte ?

2voto

Yuriy Saraykin Points 4402

Vous pouvez utiliser :

data %>% 
  filter(data.table::rleid(label) == 1)

# A tibble: 2 x 2
  label index
  <chr> <int>
1 a         1
2 a         2

1voto

tmfmnk Points 8978

Une option pourrait être :

data %>%
 slice_max(label == "a", n = 2, with_ties = FALSE)

  label index
  <chr> <int>
1 a         1
2 a         2

Cependant, elle peut générer des résultats inattendus lorsque le n est plus grand que la taille réelle du groupe. Une solution pour surmonter ce problème :

data %>%
 slice(head(which(label == "c"), 3))

  label index
  <chr> <int>
1 c         5
2 c         6

1voto

Karthik S Points 7623

Si vous voulez utiliser juste le rle :

library(dplyr)
data %>% filter(rep(seq_along(rle(label)$values), rle(label)$lengths) == 1)
# A tibble: 2 x 2
  label index
  <chr> <int>
1 a         1
2 a         2

0voto

akrun Points 148302

Une option est également de faire une comparaison avec le lag de la colonne, créez un index numérique avec cumsum et le convertir en logique à filter

library(dplyr)
data %>% 
      filter(cumsum(label != lag(label, default = first(label))) < 1)
# A tibble: 2 x 2
#  label index
#  <chr> <int>
#1 a         1
#2 a         2

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