2013-02-15 11 views
7

Może to być zbędne, ale nie mogłem znaleźć podobnego pytania na SO.Skrót R, aby uzyskać ostatnie n wpisów w wektorze

Czy istnieje skrót do uzyskania ostatnie n elementy/wpisów w wektorze lub tablicy bez użycia długość wektora w obliczeniach?

foo <- 1:23

> foo 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 

Powiedzmy chce ostatnich 7 podmiotów, chcę tego uniknąć kłopotliwych składnię:

> foo[(length(foo)-6):length(foo)] 
[1] 17 18 19 20 21 22 23 

Python foo[-7:]. Czy jest coś podobnego w R? Dzięki!

Odpowiedz

13

Ty chcesz, aby funkcja tail

foo <- 1:23 
tail(foo, 5) 
#[1] 19 20 21 22 23 
tail(foo, 7) 
#[1] 17 18 19 20 21 22 23 
x <- 1:3 
# If you ask for more than is currently in the vector it just 
# returns the vector itself. 
tail(x, 5) 
#[1] 1 2 3 

wraz z head istnieją proste sposoby, aby chwycić wszystko wyjątkiem ostatnie/pierwsze n elementów wektora jak dobrze.

x <- 1:10 
# Grab everything except the first element 
tail(x, -1) 
#[1] 2 3 4 5 6 7 8 9 10 
# Grab everything except the last element 
head(x, -1) 
#[1] 1 2 3 4 5 6 7 8 9 
+5

Plus i chciałem odnotować ładne negatywne właściwości indeksowania 'tail' i' head' dla przyszłych poszukiwaczy. Możesz powiedzieć "Daj mi wszystkie oprócz ostatnich n elementów/wierszy" jako wel: 'head (foo, -2)' –

+1

@ TylerRinker Dobry punkt - to jest dobra informacja i dodałem ją do odpowiedzi. – Dason

3

Nie jest to dobry pomysł, gdy masz funkcję ogon niesamowite ale tutaj jest alternatywa:

n <- 3 
rev(rev(foo)[1:n]) 

ja przygotowuję się do głosów w dół.

+0

+1 za sprytne użycie 'rev'. Unika także używania długości (foo). Dlaczego R nie może używać 'len' zamiast' length' jak Python ?! Zapisuje 50% pisania. – harkmug

+0

Podoba mi się pierwszy, ale drugi był wyraźnie tym, czego starali się uniknąć w pierwotnym pytaniu. – Dason

+0

@Dason dobry punkt Usunąłem go jako plakat wyraźnie stwierdza ich pogarda dla długości. –

Powiązane problemy