Angenommen, ich habe einen Vektor, der in einem Datenrahmen mit einer oder zwei Ebenen verschachtelt ist. Gibt es eine schnelle und schmutzige Möglichkeit, auf den letzten Wert zuzugreifen, ohne die length()
Funktion zu verwenden? Etwas ala PERLs $#
spezielles Var?
Also hätte ich gerne etwas wie:
dat$vec1$vec2[$#]
anstatt
dat$vec1$vec2[length(dat$vec1$vec2)]
Antworten:
Ich benutze die
tail
Funktion:Das
tail
Schöne daran ist, dass es im Gegensatz zurx[length(x)]
Redewendung auch auf Datenrahmen funktioniert .quelle
x[length(x[,1]),]
ist nicht falsch (beachten Sie das Komma in derx
Teilmenge), aber es ist sicherlich umständlich.x[length(x)]
bei größeren Vektoren langsamer ist als im Durchschnitt um den Faktor 30!tail(vector, n=1)-tail(vector, n=2)
Um dies nicht aus ästhetischer, sondern aus leistungsorientierter Sicht zu beantworten, habe ich alle oben genannten Vorschläge einem Benchmark unterzogen . Um genau zu sein, habe ich die Vorschläge berücksichtigt
x[length(x)]
mylast(x)
, womylast
ist eine C ++ - Funktion über Rcpp implementiert,tail(x, n=1)
dplyr::last(x)
x[end(x)[1]]]
rev(x)[1]
und wendete sie auf zufällige Vektoren verschiedener Größen an (10 ^ 3, 10 ^ 4, 10 ^ 5, 10 ^ 6 und 10 ^ 7). Bevor wir uns die Zahlen ansehen, sollte klar sein, dass alles, was mit größerer Eingabegröße merklich langsamer wird (dh alles, was nicht O (1) ist), keine Option ist. Hier ist der Code, den ich verwendet habe:
Es gibt mir
Dies schließt sofort alles aus, was involviert ist
rev
oderend
da dies eindeutig nichtO(1)
der Fall ist (und die resultierenden Ausdrücke werden nicht faul ausgewertet).tail
unddplyr::last
sind nicht weit davon entfernt zu sein,O(1)
aber sie sind auch erheblich langsamer alsmylast(x)
undx[length(x)]
. Damylast(x)
es langsamer ist alsx[length(x)]
und keine Vorteile bietet (es ist eher benutzerdefiniert und behandelt einen leeren Vektor nicht ordnungsgemäß), denke ich, dass die Antwort klar ist: Bitte verwendenx[length(x)]
.quelle
mylastR=function(x) {x[length(x)}
es ist schneller alsmylast
in Rcpp, aber einmal langsamer alsx[length(x)]
direkt zu schreibenWenn Sie nach etwas suchen, das so schön ist wie Pythons x [-1] -Notation, haben Sie wahrscheinlich kein Glück. Die Standardsprache ist
Es ist jedoch einfach genug, eine Funktion zu schreiben, um dies zu tun:
Diese fehlende Funktion in R nervt mich auch!
quelle
x
indem Siex[length(x)-0:3]
.Die Ideen von Lindelof und Gregg Lind kombinieren :
Wenn ich an der Eingabeaufforderung arbeite, lasse ich normalerweise das
n=
, dhtail(x, 1)
.Anders als
last
aus dempastecs
Pakethead
undtail
(ausutils
) arbeiten nicht nur Vektoren, sondern auch Datenrahmen usw. und können auch Daten " ohne erste / letzte n Elemente " zurückgeben, z(Beachten Sie, dass Sie
head
dafür statt verwenden müssentail
.)quelle
x[length(x)]
bei größeren Vektoren langsamer ist als im Durchschnitt um den Faktor 30!Das dplyr- Paket enthält eine Funktion
last()
:quelle
x[[length(x)]]
wieder darauf hinaus.last()
und diese Funktion irgendwo speichern, wie es mehrere Leute oben getan haben. Sie erhalten die verbesserte Lesbarkeit einer Funktion, wobei die Portabilität von CRAN stammt, sodass jemand anderes den Code ausführen kann.mtcars$mpg %>% last
je nach Wunsch auch als schreiben .x[[length(x)]]
!Ich habe diese beiden Ansätze im Datenrahmen mit 663.552 Zeilen mit dem folgenden Code verglichen:
und
Angenommen, Sie arbeiten mit Vektoren, ist der Zugriff auf die Längenposition erheblich schneller.
quelle
tail(strsplit(x,".",fixed=T)[[1]],1)
für den 2. Fall testen ? Für mich ist der Hauptvorteil von,tail
dass Sie es in einer Zeile schreiben können. ;)Eine andere Möglichkeit besteht darin, das erste Element des umgekehrten Vektors zu nehmen:
quelle
[1]
auf das erste Element zugreifen und (2) während Sierev
auf einen Iterator anwenden können, verhält es sich nicht wie erwartet: Es behandelt nur das Iterator-Objekt als eine Liste seiner Mitglieder und kehrt das um.Paket
data.table
enthältlast
Funktionquelle
x[[length(x)]]
wieder darauf hinaus.Ich habe eine andere Methode, um das letzte Element in einem Vektor zu finden. Angenommen, der Vektor ist
a
.Los geht's!
quelle
Was ist mit
quelle
NROW
dies genau das tut, was Sie von vielen verschiedenen Datentypen erwarten würden, aber es ist im Wesentlichen dasselbe, wasa[length(a)]
das OP zu vermeiden hofft. Die Verwendung des OP-Beispiels eines verschachtelten Vektorsdat$vec1$vec2[NROW(dat$vec1$vec2)]
ist immer noch ziemlich chaotisch.nrow
nrow
wirdNROW
ein Vektor als 1-Spalten-Matrix behandelt.Das xts-Paket bietet eine
last
Funktion:quelle