Comment accéder à la dernière valeur d'un vecteur?
Supposons que j'ai un vecteur qui est imbriqué dans un dataframe un ou deux niveaux. Est-il une façon rapide et sale pour accéder à la dernière valeur, sans l'aide de la length()
fonction? Quelque chose ala PERL $#
spécial var?
Donc je voudrais quelque chose comme:
dat$vec1$vec2[$#]
au lieu de
dat$vec1$vec2[length(dat$vec1$vec2)]
- Je ne suis en aucun cas R expert, mais un rapide google est en place ceci: <stat.l'ucl.ac.être/ISdidactique/Rhelp/bibliothèque/pastecs/html/...> Il semble y avoir une "dernière" de la fonction.
- Connexes: stackoverflow.com/q/6136613/946850
- MATLAB a la notation "mavariable(n-k)", où k est un entier inférieur à la longueur du vecteur qui va renvoyer le (la longueur(mavariable)-k)ème élément. Ce serait agréable d'avoir dans R.
Vous devez vous connecter pour publier un commentaire.
- Je utiliser le
tail
fonction:La bonne chose avec
tail
est qu'il fonctionne sur dataframes trop, contrairement à lax[length(x)]
idiome.x[length(x[,1]),]
est pas mal (notez la virgule dans lex
sous-ensemble), mais il est certainement difficile.x[length(x)]
par un facteur de 30 en moyenne pour les plus grands vecteurs!tail(vector, n=1)-tail(vector, n=2)
names
d'undata.frame
,tail
malheureusement, ne fonctionne pas:df %>% names() %>% tail(n=1) %>% assign("Foo")
quitte lecolnames
inchangé.De répondre ce n'est pas de l'esthétique mais orientés vers la performance de point de vue, j'ai mis toutes les suggestions ci-dessus par le biais d'un de référence. Pour être précis, j'ai examiné les suggestions
x[length(x)]
mylast(x)
, oùmylast
est une fonction C++ mis en œuvre par le biais de Rcpp,tail(x, n=1)
dplyr::last(x)
x[end(x)[1]]]
rev(x)[1]
et de les appliquer à des vecteurs aléatoires de différentes tailles (10^3, 10^4, 10^5, 10^6, et 10^7). Avant de nous pencher sur les chiffres, je pense qu'il devrait être clair que tout ce qui devient beaucoup plus lent, avec une plus grande taille d'entrée (c'est à dire, tout ce qui est en O(1)) n'est pas une option. Voici le code que j'ai utilisé:
Il me donne
Immédiatement les règles en ce qui concerne la
rev
ouend
car ils sont clairement pasO(1)
(et les expressions sont évaluées dans un non-paresseux de la mode).tail
etdplyr::last
ne sont pas loin d'êtreO(1)
mais ils sont aussi beaucoup plus lent quemylast(x)
etx[length(x)]
. Depuismylast(x)
est plus lent quex[length(x)]
et ne fournit pas de prestations (au contraire, il est personnalisé et ne gère pas un vecteur vide normalement), je pense que la réponse est claire: Veuillez utiliserx[length(x)]
.mylastR=function(x) {x[length(x)}
Il est plus rapide quemylast
dans Rcpp, mais un temps plus lent que d'écrirex[length(x)]
directementSi vous êtes à la recherche de quelque chose d'aussi beau que Python x de[-1] la notation, je pense que vous êtes hors de la chance. La norme de l'idiome est
mais il est assez facile d'écrire une fonction pour faire cela:
Cette fonctionnalité manquante dans la R m'énerve trop!
Combinant lindelof du et Gregg Lind est idées:
De travail à l'invite de commandes, j'ai l'habitude d'omettre l'
n=
, c'est à diretail(x, 1)
.Contrairement à
last
de lapastecs
paquet,head
ettail
(à partir deutils
) de travailler non seulement sur les vecteurs mais aussi sur des trames de données, etc., et aussi peut retourner des données "sans premier/dernier n éléments", par exemple(Notez que vous devez utiliser
head
pour cela, au lieu detail
.)x[length(x)]
par un facteur de 30 en moyenne pour les plus grands vecteurs!La dplyr package inclut une fonction
last()
:x[[length(x)]]
de nouveau.last()
et stocker cette fonction quelque part, comme plusieurs personnes l'ont fait ci-dessus. Vous obtenez l'amélioration de la lisibilité d'une fonction, avec la portabilité de venir de CRAN, de sorte que quelqu'un d'autre peut exécuter le code.mtcars$mpg %>% last
, selon vos préférences.x[[length(x)]]
, si!J'ai juste comparé ces deux approches sur des données de trame avec 663,552 lignes en utilisant le code suivant:
et
Donc, en supposant que vous travaillez avec des vecteurs, en accédant à la longueur de position est nettement plus rapide.
tail(strsplit(x,".",fixed=T)[[1]],1)
pour le 2ème cas? Pour moi, le principal avantage de latail
est que vous pouvez l'écrire en une seule ligne. 😉Une autre façon est de prendre le premier élément de l'inversion de l'vecteur:
[1]
pour accéder au premier élément et (2), tandis que vous pouvez appliquerrev
à un itérateur, il ne se comporte pas comme prévu: il traite de l'itérateur de l'objet en tant que liste de ses membres et renverse que des.Paquet
data.table
comprendlast
fonctionx[[length(x)]]
de nouveau.J'ai une autre méthode pour trouver le dernier élément dans un vecteur.
Dire que le vecteur est
a
.Là vous allez!
Whats sur
NROW
est-ce que vous attendez sur un beaucoup de différents types de données, mais c'est essentiellement le même quea[length(a)]
que l'OP est dans l'espoir d'éviter. À l'aide de l'OP de l'exemple d'un vecteur imbriqué,dat$vec1$vec2[NROW(dat$vec1$vec2)]
est toujours assez compliqué.nrow
nrow
,NROW
traite un vecteur tel que 1-colonne de la matrice.La xts paquet fournit un
last
fonction: