supprimer le dernier élément d'un vecteur

je dois supprimer le dernier nombre dans un groupe de vecteurs, i.e.:

v <- 1:3
v1 <- 4:8

devrait être:

v <- 1:2
v1 <- 4:7
20
demandé sur Gregor 2012-08-24 21:59:36

4 réponses

vous pouvez utiliser des offsets négatifs dans head (ou tail), donc head(x, -1) supprime le dernière elément:

R> head( 1:4, -1)
[1] 1 2 3
R> 

ceci sauve aussi un appel supplémentaire à length().

Edit: Comme l'a souligné Jason, cette approche est en fait pas plus rapide. Ne peut pas argumenter avec empirics. Sur ma machine:

R> x <- rnorm(1000)
R> microbenchmark( y <- head(x, -1), y <- x[-length(x)], times=10000)
Unit: microseconds
                expr    min      lq median     uq     max
1   y <- head(x, -1) 29.412 31.0385 31.713 32.578 872.168
2 y <- x[-length(x)] 14.703 15.1150 15.565 15.955 706.880
R> 
46
répondu Dirk Eddelbuettel 2012-08-28 02:55:11

Utiliser la longueur pour obtenir la longueur de l'objet et à supprimer le dernier.

v[-length(v)]

un indice négatif dans R extrait tout mais les indices donnés.

23
répondu Luciano Selzer 2012-08-24 18:04:40

Dirk et Iselzer ont déjà fourni les réponses. Dirk est certainement la plus simple, mais sur mon système, au moins, il est légèrement plus lent, probablement parce que vecteur.[ et length la vérification est bon marché (et selon la source,head utiliser length, deux fois en fait):

> x <- rnorm(1000)
> system.time(replicate(50000, y <- head(x, -1)))
   user  system elapsed 
   3.69    0.56    4.25 
> system.time(replicate(50000, y <- x[-length(x)]))
   user  system elapsed 
  3.504   0.552   4.058

ce patron s'est maintenu pour des longueurs de vecteur plus grandes et plus de reproductions. YMMV. La lisibilité de l' head certainement surpasse la performance marginale l'amélioration de l' [ dans la plupart des cas.

7
répondu Jason Morgan 2012-08-28 02:44:07

c'est une autre option, qui n'a pas été suggérée auparavant. NROW traite votre vecteur comme une matrice à une colonne.

v[-max(NROW(v))]#1 2
v1[-max(NROW(v1))]#4 5 6 7

basé sur la discussion ci-dessus, ceci est (légèrement) plus rapide que toutes les autres méthodes suggérées:

x <- rnorm(1000)
system.time(replicate(50000, y <- head(x, -1)))
user  system elapsed 
3.446   0.292   3.762
system.time(replicate(50000, y <- x[-length(x)]))
user  system elapsed 
2.131   0.326   2.472
system.time(replicate(50000, y <- x[-max(NROW(x))]))
user  system elapsed 
2.076   0.262   2.342
2
répondu milan 2018-06-08 13:54:23