Apa cara terbaik untuk menggunakan beberapa kolom data.table
? Sebagai contoh:
f <- function(x) {c("hi", "hello")}
x <- data.table(id = 1:10)
Saya ingin melakukan sesuatu seperti ini (tentu saja sintaks ini salah):
x[ , (col1, col2) := f(), by = "id"]
Dan untuk memperluas itu, saya mungkin memiliki banyak kolom dengan nama yang disimpan dalam variabel (katakanlah col_names
) dan saya ingin melakukan:
x[ , col_names := another_f(), by = "id", with = FALSE]
Apa cara yang benar untuk melakukan sesuatu seperti ini?
by
sama dengan @Christoph_J benar untuk mengatakan. Tautkan ke pertanyaan Anda yang ditambahkan ke FR # 2120 "Drop needing with = FALSE for LHS of: =", sehingga tidak akan lupa untuk mengunjungi kembali.f()
adalah fungsi yang mengembalikan beberapa nilai, satu untuk setiap kolom Anda.Jawaban:
Ini sekarang bekerja di v1.8.3 pada R-Forge. Terima kasih telah menyorotnya!
Versi yang lebih lama menggunakan
with
argumen (kami mencegah argumen ini bila memungkinkan):sumber
data.table(objectName=ls())[,c("rows","cols"):=dim(get(objectName)),by=objectName]
(Saya menggunakandata.table
1.8.11)dim
mengembalikan vektor sehingga mengonversi itu untuk mengetiklist
harus memutarnya; mis[,c("rows","cols"):=as.list(dim(get(objectName))),by=objectName]
. Masalahnya adalah yangas.list
memiliki panggilan overhead dan juga menyalin vektor kecil. Jika efisiensi menjadi masalah karena jumlah grup meningkat maka beri tahu kami.x[,mynames:=list(mean(b)*4,sum(b)*3),by=a,with=FALSE][]
) sekarang melempar peringatan, jadi mungkin menghapusnya? Pada catatan terkait, adakah yang menyarankan agar, denganoptions(datatable.WhenJisSymbolThenCallingScope=TRUE)
, penugasan sepertix[,mynames:=list(mean(b)*4,sum(b)*3),by=a]
apakah sebenarnya berhasil? Sepertinya itu akan konsisten dengan perubahan lain, meskipun saya kira itu mungkin merusak terlalu banyak kode pengguna yang ada (?).by=a
itu akan berhasil, tetapi kembalikan jawaban yang berbeda. Themean(a)
dansum(a)
agregat sedang didaur ulang dalam setiap kelompok saatby=a
. Tanpanyaby=a
hanya akan menempelkanmean
dansum
untuk seluruh kolom ke dalam setiap sel (yaitu angka yang berbeda).Notasi steno berikut mungkin berguna. Semua kredit diberikan kepada Andrew Brooks, khususnya artikel ini .
sumber