Załóżmy, że mam wektor zagnieżdżony w ramce danych na jednym lub dwóch poziomach. Czy istnieje szybki i brudny sposób uzyskania dostępu do ostatniej wartości bez korzystania zlength()
funkcji? Coś innego niż $#
specjalny wariant PERL ?
Chciałbym więc coś takiego:
dat$vec1$vec2[$#]
zamiast
dat$vec1$vec2[length(dat$vec1$vec2)]
Odpowiedzi:
Korzystam z
tail
funkcji:Zaletą ze
tail
jest to, że działa na dataframes też, w przeciwieństwie dox[length(x)]
idiomu.źródło
x[length(x[,1]),]
nie jest zła (zwróć uwagę na przecinek wx
podzbiorze), ale z pewnością jest niezręczna.x[length(x)]
średnio 30 razy dla większych wektorów!tail(vector, n=1)-tail(vector, n=2)
Aby odpowiedzieć na to nie z estetycznego, ale zorientowanego na wydajność punktu widzenia, przedstawiłem wszystkie powyższe sugestie jako punkt odniesienia . Mówiąc dokładniej, rozważałem sugestie
x[length(x)]
mylast(x)
, gdziemylast
jest funkcja C ++ zaimplementowana przez Rcpp,tail(x, n=1)
dplyr::last(x)
x[end(x)[1]]]
rev(x)[1]
i zastosował je do losowych wektorów o różnych rozmiarach (10 ^ 3, 10 ^ 4, 10 ^ 5, 10 ^ 6 i 10 ^ 7). Zanim spojrzymy na liczby, myślę, że powinno być jasne, że wszystko, co staje się zauważalnie wolniejsze przy większym rozmiarze wejściowym (tj. Wszystko, co nie jest O (1)), nie jest opcją. Oto kod, którego użyłem:
To daje mi
To natychmiast wyklucza wszystko, co wiąże się z tym,
rev
lubend
ponieważ najwyraźniej tak nie jestO(1)
(a wyrażenia wynikowe są oceniane w sposób nie leniwy).tail
idplyr::last
nie są daleko od bycia,O(1)
ale są również znacznie wolniejsze niżmylast(x)
ix[length(x)]
. Ponieważmylast(x)
jest wolniejszy niżx[length(x)]
i nie daje żadnych korzyści (raczej jest niestandardowy i nie obsługuje z wdziękiem pustego wektora), myślę, że odpowiedź jest jasna: Proszę użyćx[length(x)]
.źródło
mylastR=function(x) {x[length(x)}
Jest to szybsze niżmylast
w Rcpp, ale raz wolniejsze niż pisaniex[length(x)]
bezpośrednioJeśli szukasz czegoś tak ładnego jak notacja x [-1] Pythona, myślę, że nie masz szczęścia. Standardowy idiom to
ale wystarczy napisać funkcję, aby to zrobić:
Irytuje mnie ta brakująca funkcja w R!
źródło
x
robiącx[length(x)-0:3]
.Łączenie pomysłów Lindelof i Gregga Linda :
Pracując w linii poleceń, zwykle pomijam
n=
, tjtail(x, 1)
.W przeciwieństwie
last
dopastecs
pakietuhead
itail
(zutils
) działa nie tylko na wektorach, ale także na ramkach danych itp., A także może zwracać dane „ bez pierwszych / ostatnich n elementów ”, np.(Pamiętaj, że musisz do tego użyć
head
zamiasttail
.)źródło
x[length(x)]
średnio 30 razy dla większych wektorów!Dplyr pakiet zawiera funkcję
last()
:źródło
x[[length(x)]]
ponownie.last()
i przechowywać tej funkcji gdzieś, jak zrobiło to kilka osób powyżej. Uzyskujesz lepszą czytelność funkcji, a jej przenośność pochodzi z CRAN, aby ktoś inny mógł uruchomić kod.mtcars$mpg %>% last
, w zależności od preferencji.x[[length(x)]]
!Właśnie przetestowałem te dwa podejścia w ramce danych z 663552 wierszami, używając następującego kodu:
i
Zakładając, że pracujesz z wektorami, dostęp do pozycji długości jest znacznie szybszy.
źródło
tail(strsplit(x,".",fixed=T)[[1]],1)
w drugim przypadku? Dla mnie główną zaletątail
jest to, że możesz napisać to w jednym wierszu. ;)Innym sposobem jest pobranie pierwszego elementu wektora odwróconego:
źródło
[1]
aby uzyskać dostęp do pierwszego elementu i (2), podczas gdy możesz zastosowaćrev
do iteratora, nie działa on zgodnie z oczekiwaniami: po prostu traktuje obiekt iteratora jako lista jego członków i odwraca to.Pakiet
data.table
zawieralast
funkcjęźródło
x[[length(x)]]
ponownie.Mam inną metodę znajdowania ostatniego elementu w wektorze. Powiedz, że wektor jest
a
.Proszę bardzo!
źródło
O co chodzi
źródło
NROW
robi to, czego można oczekiwać na wielu różnych typach danych, ale jest to w zasadzie to samo, coa[length(a)]
ten OP chce uniknąć. Korzystając z przykładu zagnieżdżonego wektora OP,dat$vec1$vec2[NROW(dat$vec1$vec2)]
nadal jest dość niechlujny.nrow
nrow
,NROW
traktuje wektora jako matrycy 1 kolumny.Pakiet xts zapewnia
last
funkcję:źródło