web-dev-qa-db-fra.com

Supprimer les N dernières lignes du bloc de données avec le nombre arbitraire de lignes

J'ai un bloc de données et je veux en supprimer les N dernières lignes. Si je veux supprimer 5 lignes, j'utilise actuellement la commande suivante, qui à mon avis est plutôt compliquée:

df<- df[-seq(nrow(df),nrow(df)-4),]

Comment pourriez-vous accomplir la tâche, existe-t-il une fonction pratique que je peux utiliser dans R?

Sous Unix, j'utiliserais:

tac file | sed '1,5d' | tac 
34
Alby

head avec un indice négatif est pratique pour cela ...

df <- data.frame( a = 1:10 )
head(df,-5)
#  a
#1 1
#2 2
#3 3
#4 4
#5 5

p.s. votre exemple seq() peut être écrit légèrement moins (?) maladroitement en utilisant les arguments nommés by et length.out (raccourci à len) comme ceci -seq(nrow(df),by=-1,len=5).

61
Simon O'Hanlon

Celui-ci prend une ligne de plus, mais est beaucoup plus lisible:

n<-dim(df)[1]
df<-df[1:(n-5),]

Bien sûr, vous pouvez le faire sur une seule ligne en collant la commande dim directement dans l'instruction de réaffectation. Je suppose que cela fait partie d'un script reproductible, et vous pouvez revenir sur vos étapes ... Sinon, nous vous recommandons fortement dans de tels cas d'enregistrer dans une autre variable (par exemple, df2), puis supprimez la copie redondante uniquement lorsque vous êtes sûr d'avoir obtenu ce que vous vouliez.

14
Assaf

Ajout d'une réponse dplyr pour être complet:

test_df <- data_frame(a = c(1,2,3,4,5,6,7,8,9,10), 
                      b = c("a","b","c","d","e","f","g","h","i","j"))
slice(test_df, 1:(n()-5))

## A tibble: 5 x 2
#      a b    
#  <dbl> <chr>
#1     1 a    
#2     2 b    
#3     3 c    
#4     4 d    
#5     5 e    
6
Oscar