Supposons que j'ai un vecteur imbriqué dans une trame de données à un ou deux niveaux. Existe-t-il un moyen rapide et sale d'accéder à la dernière valeur, sans utiliser la length()
fonction? Quelque chose d'ala $#
spécial PERL var?
Je voudrais donc quelque chose comme:
dat$vec1$vec2[$#]
au lieu de
dat$vec1$vec2[length(dat$vec1$vec2)]
Réponses:
J'utilise la
tail
fonction:La bonne chose avec,
tail
c'est qu'il fonctionne aussi sur les cadres de données, contrairement à l'x[length(x)]
idiome.la source
x[length(x[,1]),]
n'est pas fausse (notez la virgule dans lex
sous - ensemble), mais c'est certainement gênant.x[length(x)]
d'un facteur 30 en moyenne pour les vecteurs plus gros!tail(vector, n=1)-tail(vector, n=2)
Pour répondre à cette question non pas d'un point de vue esthétique mais axé sur les performances, j'ai mis toutes les suggestions ci-dessus à travers une référence . Pour être précis, j'ai considéré les suggestions
x[length(x)]
mylast(x)
, où semylast
trouve une fonction C ++ implémentée via Rcpp,tail(x, n=1)
dplyr::last(x)
x[end(x)[1]]]
rev(x)[1]
et les a appliqués à des vecteurs aléatoires de différentes tailles (10 ^ 3, 10 ^ 4, 10 ^ 5, 10 ^ 6 et 10 ^ 7). Avant d'examiner les chiffres, je pense qu'il devrait être clair que tout ce qui devient sensiblement plus lent avec une plus grande taille d'entrée (c'est-à-dire tout ce qui n'est pas O (1)) n'est pas une option. Voici le code que j'ai utilisé:
Ça me donne
Cela exclut immédiatement tout ce qui implique
rev
ouend
comme ils ne le sont clairement pasO(1)
(et les expressions résultantes sont évaluées de manière non paresseuse).tail
etdplyr::last
ne sont pas loin d'être,O(1)
mais ils sont aussi considérablement plus lents quemylast(x)
etx[length(x)]
. Puisqu'ilmylast(x)
est plus lentx[length(x)]
et ne fournit aucun avantage (il est plutôt personnalisé et ne gère pas un vecteur vide avec élégance), je pense que la réponse est claire: veuillez utiliserx[length(x)]
.la source
mylastR=function(x) {x[length(x)}
C'est plus rapide quemylast
dans Rcpp, mais une fois plus lent que d'écrirex[length(x)]
directementSi vous cherchez quelque chose d'aussi agréable que la notation x [-1] de Python, je pense que vous n'avez pas de chance. L'idiome standard est
mais il est assez facile d'écrire une fonction pour ce faire:
Cette fonctionnalité manquante dans R m'énerve aussi!
la source
x
en faisantx[length(x)-0:3]
.Combiner les idées de Lindelof et de Gregg Lind :
En travaillant à l'invite, j'omets généralement le
n=
, c.-à-d.tail(x, 1)
.Contrairement
last
aupastecs
package,head
ettail
(à partir deutils
) fonctionne non seulement sur les vecteurs mais également sur les trames de données, etc., et peut également renvoyer des données " sans premier / dernier n éléments ", par exemple(Notez que vous devez utiliser
head
pour cela, au lieu detail
.)la source
x[length(x)]
d'un facteur 30 en moyenne pour les vecteurs plus gros!Le package dplyr comprend une fonction
last()
:la source
x[[length(x)]]
nouveau.last()
et à la stocker quelque part, comme plusieurs personnes l'ont fait ci-dessus. Vous obtenez la lisibilité améliorée d'une fonction, avec la portabilité de celle-ci provenant de CRAN afin que quelqu'un d'autre puisse exécuter le code.mtcars$mpg %>% last
, selon votre préférence.x[[length(x)]]
, cependant!Je viens de comparer ces deux approches sur la trame de données avec 663 552 lignes en utilisant le code suivant:
et
Donc, en supposant que vous travaillez avec des vecteurs, l'accès à la position de longueur est beaucoup plus rapide.
la source
tail(strsplit(x,".",fixed=T)[[1]],1)
le 2ème cas? Pour moi, le principal avantage de latail
est que vous pouvez l'écrire sur une seule ligne. ;)Une autre façon est de prendre le premier élément du vecteur inversé:
la source
[1]
pour accéder au premier élément et (2) pendant que vous pouvez appliquerrev
à un itérateur, il ne se comporte pas comme prévu: il traite simplement l'objet itérateur comme une liste de ses membres et l'inverse.Le forfait
data.table
comprend unelast
fonctionla source
x[[length(x)]]
nouveau.J'ai une autre méthode pour trouver le dernier élément d'un vecteur. Disons que le vecteur l'est
a
.Voilà!
la source
De quoi s'agit-il
la source
NROW
fasse ce que vous attendez sur beaucoup de types de données différents, mais c'est essentiellement la même chosea[length(a)]
que OP espère éviter. L'utilisation de l'exemple OP d'un vecteur imbriquédat$vec1$vec2[NROW(dat$vec1$vec2)]
est toujours assez compliquée.nrow
nrow
,NROW
traite un vecteur comme une matrice à 1 colonne.Le package xts fournit une
last
fonction:la source