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