Misalkan saya memiliki vektor yang bersarang dalam kerangka data satu atau dua tingkat. Apakah ada cara cepat dan kotor untuk mengakses nilai terakhir, tanpa menggunakan length()
fungsi? Sesuatu yang $#
spesial dengan PERL ?
Jadi saya ingin sesuatu seperti:
dat$vec1$vec2[$#]
dari pada
dat$vec1$vec2[length(dat$vec1$vec2)]
Jawaban:
Saya menggunakan
tail
fungsi:Yang menyenangkan
tail
adalah bahwa ia bekerja pada kerangka data juga, tidak sepertix[length(x)]
idiom.sumber
x[length(x[,1]),]
tidak salah (perhatikan koma dix
subset), tapi tentu saja canggung.x[length(x)]
rata-rata 30 untuk vektor yang lebih besar!tail(vector, n=1)-tail(vector, n=2)
Untuk menjawab ini bukan dari sudut pandang estetika tetapi berorientasi kinerja, saya telah memasukkan semua saran di atas melalui tolok ukur . Lebih tepatnya, saya sudah mempertimbangkan saran
x[length(x)]
mylast(x)
, di manamylast
fungsi C ++ diimplementasikan melalui Rcpp,tail(x, n=1)
dplyr::last(x)
x[end(x)[1]]]
rev(x)[1]
dan menerapkannya pada vektor acak dengan berbagai ukuran (10 ^ 3, 10 ^ 4, 10 ^ 5, 10 ^ 6, dan 10 ^ 7). Sebelum kita melihat angka-angkanya, saya pikir harus jelas bahwa segala sesuatu yang terasa lebih lambat dengan ukuran input yang lebih besar (yaitu, apa pun yang bukan O (1)) bukanlah suatu pilihan. Berikut kode yang saya gunakan:
Itu memberi saya
Ini dengan segera mengesampingkan apa pun yang melibatkan
rev
atauend
karena mereka jelas tidakO(1)
(dan ekspresi yang dihasilkan dievaluasi dengan cara yang tidak malas).tail
dandplyr::last
tidak jauh dari keberadaanO(1)
tetapi mereka juga jauh lebih lambat daripadamylast(x)
danx[length(x)]
. Karenamylast(x)
lebih lambat daripadax[length(x)]
dan tidak memberikan manfaat (lebih tepatnya, itu adalah kebiasaan dan tidak menangani vektor kosong dengan anggun), saya pikir jawabannya jelas: Silakan gunakanx[length(x)]
.sumber
mylastR=function(x) {x[length(x)}
ini lebih cepat daripadamylast
di Rcpp, tetapi satu kali lebih lambat daripada menulisx[length(x)]
secara langsungJika Anda mencari sesuatu yang sebagus notasi Python x [-1], saya pikir Anda kurang beruntung. Ungkapan standarnya adalah
tetapi cukup mudah untuk menulis fungsi untuk melakukan ini:
Fitur yang hilang di R ini juga mengganggu saya!
sumber
x
dengan melakukanx[length(x)-0:3]
.Menggabungkan ide lindelof dan Gregg Lind :
Bekerja pada prompt, saya biasanya menghilangkan
n=
, yaitutail(x, 1)
.Tidak seperti
last
daripastecs
paket,head
dantail
(dariutils
) bekerja tidak hanya pada vektor tetapi juga pada frame data dll, dan juga dapat mengembalikan data " tanpa elemen n pertama / terakhir ", mis.(Perhatikan bahwa Anda harus menggunakan
head
ini, alih-alihtail
.)sumber
x[length(x)]
rata-rata 30 untuk vektor yang lebih besar!The dplyr paket termasuk fungsi
last()
:sumber
x[[length(x)]]
lagi.last()
dan menyimpan fungsi itu di suatu tempat, seperti yang dilakukan beberapa orang di atas. Anda mendapatkan keterbacaan fungsi yang ditingkatkan, dengan portabilitasnya berasal dari CRAN sehingga orang lain dapat menjalankan kode.mtcars$mpg %>% last
, tergantung pada preferensi Anda.x[[length(x)]]
!Saya hanya membandingkan dua pendekatan ini pada kerangka data dengan 663.552 baris menggunakan kode berikut:
dan
Jadi, dengan asumsi Anda bekerja dengan vektor, mengakses posisi panjang secara signifikan lebih cepat.
sumber
tail(strsplit(x,".",fixed=T)[[1]],1)
untuk kasus ke-2? Bagi saya keuntungan utamatail
adalah Anda dapat menulisnya dalam satu baris. ;)Cara lain adalah dengan mengambil elemen pertama dari vektor terbalik:
sumber
[1]
untuk mengakses elemen pertama dan (2) sementara Anda dapat menerapkanrev
ke iterator, itu tidak berperilaku seperti yang diharapkan: itu hanya memperlakukan objek iterator sebagai daftar anggotanya dan membalikkan itu.Paket
data.table
termasuklast
fungsisumber
x[[length(x)]]
lagi.Saya punya metode lain untuk menemukan elemen terakhir dalam vektor. Katakanlah vektor
a
.Ini dia!
sumber
Tentang apa
sumber
NROW
melakukan apa yang Anda harapkan pada banyak tipe data yang berbeda, tetapi pada dasarnya sama dengana[length(a)]
yang ingin dihindari OP. Menggunakan contoh OP dari vektor bersarang,dat$vec1$vec2[NROW(dat$vec1$vec2)]
masih cukup berantakan.nrow
nrow
,NROW
memperlakukan vektor sebagai matriks 1-kolom.Paket xts menyediakan
last
fungsi:sumber