Bonjour, j'ai un df tel que
COL1 COL2 F 0.87 G 0.82 H 0.57
et je voudrais sous-définir le df pour toute la ligne après la ligne "BRUT"
et obtenez:
COL1 COL2 A OKI B OKO C OKU D OKP E BRUT F 0.87 G 0.82 H 0.57
4 Réponses :
Vous pouvez utiliser which.max pour obtenir le numéro de ligne de la première valeur de "BRUT".
df <- structure(list(COL1 = c("A", "B", "C", "D", "E", "F", "G", "H"
), COL2 = c("OKI", "OKO", "OKU", "OKP", "BRUT", "0.87", "0.82",
"0.57")), class = "data.frame", row.names = c(NA, -8L))
Quelques autres options de comparaison avec le numéro de ligne:
library(dplyr) df %>% filter(row_number() > which.max(COL2 == 'BRUT'))
Utilisation de dplyr :
df[seq_len(nrow(df)) > which.max(df$COL2 == 'BRUT'), ]
données
df[(which.max(df$COL2 == 'BRUT') + 1):nrow(df), ] # COL1 COL2 #6 F 0.87 #7 G 0.82 #8 H 0.57
Vous pouvez utiliser match pour obtenir la ligne avec BRUT , ajouter 1 et créer une séquence jusqu'à nrow (x) au sous-ensemble x pour obtenir toutes les lignes après BRUT.
x[-(1:match("BRUT", x$COL2)),]
x[-seq_len(match("BRUT", x$COL2)),]
Ou en utilisant tail , comme suggéré par @thelatemail (Merci! ).
tail(x, -match("BRUT",x$COL2))
Ou d'autres alternatives:
x[(match("BRUT", x$COL2)+1):nrow(x),]
# COL1 COL2
#6 F 0.87
#7 G 0.82
#8 H 0.57
Une alternative à l'utilisation de match est de tail pour supprimer les lignes une fois que vous avez obtenu l'index - tail (x, -match ("BRUT", x $ COL2)) < / code>
@thelatemail Merci! J'ai ajouté ceci.
Il semble que vous ne vouliez que les valeurs numériques. Dans ce cas, une solution plus robuste peut être,
df[grepl('[0-9]', df$COL2),]
# COL1 COL2
#6 F 0.87
#7 G 0.82
#8 H 0.57
Une autre option avec cumsum dans base R
df <- structure(list(COL1 = c("A", "B", "C", "D", "E", "F", "G", "H"
), COL2 = c("OKI", "OKO", "OKU", "OKP", "BRUT", "0.87", "0.82",
"0.57")), class = "data.frame", row.names = c(NA, -8L))
subset(df, cumsum(cumsum(COL2 == "BRUT")) >1) # COL1 COL2 #6 F 0.87 #7 G 0.82 #8 H 0.57
p>