1
votes

Ligne de sous-ensemble dans df après la première ligne contenant une valeur spécifique

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

r

0 commentaires

4 Réponses :


2
votes

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


0 commentaires

4
votes

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


2 commentaires

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.



3
votes

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


0 commentaires

2
votes

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))

data

subset(df, cumsum(cumsum(COL2 == "BRUT")) >1)
#  COL1 COL2
#6    F 0.87
#7    G 0.82
#8    H 0.57

p>


0 commentaires