101 votes

Obtenir les n derniers éléments d'un vecteur. Existe-t-il un meilleur moyen que d'utiliser la fonction length() ?

Si, pour des raisons d'argument, je veux les cinq derniers éléments d'un vecteur de 10 longueurs en Python, je peux utiliser l'opérateur "-" dans l'index de plage ainsi :

 >>> x = range(10)
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x[-5:]
[5, 6, 7, 8, 9]
>>>

Quelle est la meilleure façon de le faire dans R ? Existe-t-il un moyen plus propre que ma technique actuelle qui consiste à utiliser la fonction length() ?

 > x <- 0:9
> x
 [1] 0 1 2 3 4 5 6 7 8 9
> x[(length(x) - 4):length(x)]
[1] 5 6 7 8 9
> 

La question est liée à l'analyse des séries temporelles d'ailleurs où il est souvent utile de ne travailler que sur des données récentes.

4voto

Sacha Epskamp Points 14956

Vous pouvez faire exactement la même chose dans R avec deux autres caractères :

 x <- 0:9
x[-5:-1]
[1] 5 6 7 8 9

ou alors

 x[-(1:5)]

4voto

Brian Davis Points 477

Que diriez-vous de rev(x)[1:5] ?

 x<-1:10
system.time(replicate(10e6,tail(x,5)))
 user  system elapsed 
 138.85    0.26  139.28 

system.time(replicate(10e6,rev(x)[1:5]))
 user  system elapsed 
 61.97    0.25   62.23

2voto

Roy Points 146

Voici une fonction pour le faire et semble raisonnablement rapide.

 endv<-function(vec,val) 
{
if(val>length(vec))
{
stop("Length of value greater than length of vector")
}else
{
vec[((length(vec)-val)+1):length(vec)]
}
}

USAGE:

 test<-c(0,1,1,0,0,1,1,NA,1,1)
endv(test,5)
endv(LETTERS,5)

RÉFÉRENCE:

                                                     test replications elapsed relative
1                                 expression(tail(x, 5))       100000    5.24    6.469
2 expression(x[seq.int(to = length(x), length.out = 5)])       100000    0.98    1.210
3                       expression(x[length(x) - (4:0)])       100000    0.81    1.000
4                                 expression(endv(x, 5))       100000    1.37    1.691

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X