Suponha que eu tenha um vetor aninhado em um dataframe em um ou dois níveis. Existe uma maneira rápida e suja de acessar o último valor, sem usar a length()
função? Algo ala PERL$#
var especial ?
Então, eu gostaria de algo como:
dat$vec1$vec2[$#]
ao invés de
dat$vec1$vec2[length(dat$vec1$vec2)]
Respostas:
Eu uso a
tail
função:O bom
tail
é que ele também funciona em quadros de dados, ao contrário dox[length(x)]
idioma.fonte
x[length(x[,1]),]
não está errada (observe a vírgula nox
subconjunto), mas certamente é incômoda.x[length(x)]
um fator de 30 em média para vetores maiores!tail(vector, n=1)-tail(vector, n=2)
Para responder a isso não do ponto de vista estético, mas orientado para o desempenho, coloquei todas as sugestões acima através de uma referência . Para ser mais preciso, considerei as sugestões
x[length(x)]
mylast(x)
, ondemylast
é uma função C ++ implementada por meio do Rcpp,tail(x, n=1)
dplyr::last(x)
x[end(x)[1]]]
rev(x)[1]
e os aplicou a vetores aleatórios de vários tamanhos (10 ^ 3, 10 ^ 4, 10 ^ 5, 10 ^ 6 e 10 ^ 7). Antes de olharmos para os números, acho que deve ficar claro que qualquer coisa que se torne visivelmente mais lenta com maior tamanho de entrada (ou seja, qualquer coisa que não seja O (1)) não é uma opção. Aqui está o código que eu usei:
Me dá
Isso exclui imediatamente qualquer coisa que envolva
rev
ouend
uma vez que claramente não éO(1)
(e as expressões resultantes são avaliadas de maneira não preguiçosa).tail
edplyr::last
não estão longe de existir,O(1)
mas também são consideravelmente mais lentos quemylast(x)
ex[length(x)]
. Comomylast(x)
é mais lentox[length(x)]
e não oferece benefícios (é personalizado e não lida com um vetor vazio normalmente), acho que a resposta é clara: usex[length(x)]
.fonte
mylastR=function(x) {x[length(x)}
É mais rápido do quemylast
em Rcpp, mas houve um tempo mais lento do que escreverx[length(x)]
diretamenteSe você está procurando algo tão bom quanto a notação x [-1] do Python, acho que você está sem sorte. O idioma padrão é
mas é fácil o suficiente escrever uma função para fazer isso:
Esse recurso que falta no R também me incomoda!
fonte
x
fazendox[length(x)-0:3]
.Combinando as idéias de Lindind e Gregg Lind :
Trabalhando no prompt, geralmente omito o
n=
, ou seja,tail(x, 1)
.Diferente
last
dopastecs
pacote,head
etail
(deutils
) trabalham não apenas em vetores, mas também em quadros de dados etc., e também podem retornar dados " sem o primeiro / último n elementos ", por exemplo(Observe que você precisa usar
head
isso em vez detail
.)fonte
x[length(x)]
um fator de 30 em média para vetores maiores!O pacote dplyr inclui uma função
last()
:fonte
x[[length(x)]]
novamente.last()
e armazenar essa função em algum lugar, como várias pessoas fizeram acima. Você obtém a legibilidade aprimorada de uma função, com a portabilidade dela vindo do CRAN para que outra pessoa possa executar o código.mtcars$mpg %>% last
, dependendo da sua preferência.x[[length(x)]]
que!Acabei de comparar essas duas abordagens no quadro de dados com 663.552 linhas usando o seguinte código:
e
Portanto, supondo que você esteja trabalhando com vetores, acessar a posição do comprimento é significativamente mais rápido.
fonte
tail(strsplit(x,".",fixed=T)[[1]],1)
para o segundo caso? Para mim, a principal vantagem dotail
é que você pode escrevê-lo em uma linha. ;)Outra maneira é pegar o primeiro elemento do vetor invertido:
fonte
[1]
para acessar o primeiro elemento e (2) enquanto pode aplicarrev
a um iterador, ele não se comporta como o esperado: trata apenas o objeto do iterador como uma lista de seus membros e reverte isso.O pacote
data.table
inclui alast
funçãofonte
x[[length(x)]]
novamente.Eu tenho outro método para encontrar o último elemento em um vetor. Digamos que o vetor seja
a
.Ai está!
fonte
Sobre o quê
fonte
NROW
faça o que você esperaria em vários tipos de dados diferentes, mas é essencialmente o mesmoa[length(a)]
que o OP espera evitar. Usando o exemplo do OP de um vetor aninhado,dat$vec1$vec2[NROW(dat$vec1$vec2)]
ainda é bastante confuso.nrow
nrow
,NROW
trata um vetor como matriz de 1 coluna.O pacote xts fornece uma
last
função:fonte