Dikirim oleh: Matt Weller; Ditugaskan ke: Tidak ada; Tautan R-Forge
Saat menggunakan .SDcols
(untuk tujuan menerapkan fungsi ke beberapa kolom) saya tidak dapat mereferensikan kolom lain di tabel asli (v1) menggunakan sintaks berikut:
dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
# Error in `[.data.table`(dt, , list(v1 = sum(v1), lapply(.SD, mean)), by = grp, :
# object 'v1' not found
Kesalahan serupa terjadi ketika saya menggunakan c sebagai ganti daftar, jelas kolom v1 tidak dapat diakses dalam klausa j
.
Saya menggunakan kode berikut yang menyertakan kolom v1, meskipun saya tidak ingin itu dimasukkan dalam bagian lapply
, harus menjatuhkannya setelah perhitungan.
sd.cols = c("v1","v2", "v3")
dt.out = dt[, c(sum.v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]
Menurut eddi di Stackoverflow ini adalah bug dan dia meminta saya untuk melaporkannya. Saya tidak dapat memberikan lebih banyak detail karena saya tidak yakin bagian mana yang menurutnya bug, melihat jawaban yang diterima oleh Arun dan diskusi mereka selanjutnya akan menyoroti di mana tetapi masalahnya.
Berikut adalah posting SO yang relevan.
Pos lain untuk diperbarui: http://stackoverflow.com/questions/27755518/data-table-sd-lapply-multiple-columns-in-argument
Bit-an, tetapi menambahkan ini pertanyaan saya untuk tumpukan
Saya bahkan tidak menganggapnya sebagai bug, biasanya saya menyediakan bidang wajib tambahan ke .SDcols
dan kemudian di j
Saya menggunakan .SD[, !"total", with=FALSE]
untuk mengecualikan kolom yang tidak diinginkan.
Itu solusi bagus lainnya, saya ingin tahu perbedaan kinerja vis-a-vis menggunakan dt$total
. Dan ya, ini menari garis antara FR dan bug, IMO.
Menabrak ini lagi. Sepertinya ini bisa menjadi perbaikan yang sangat penting. pertanyaan ini tampaknya terkait dengan dan berpotensi diselesaikan melalui DT[, (deltaColsNewNames) := lapply(.SD, normalDelta, price), .SDcols = deltaColsNames]
Berikut kasus sederhana lainnya di mana ini akan berguna: http://stackoverflow.com/a/32498711/1191259
Berikut kasus sederhana lain yang menderita: http://stackoverflow.com/questions/32944060/using-data-table-to-calculate-new-columns/32944519#32944519
Lain untuk diperbarui saat diperbaiki: http://stackoverflow.com/q/32915770/1191259
Yay! sekarang kita bisa melakukan ini:
require(data.table)
dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
# grp v1 v2 v3
# 1: 2 7 4.5 12.5
# 2: 3 12 4.0 13.0
# 3: 1 9 3.5 13.5
Memperbarui semua posting SO yang ditautkan di sini. Terimakasih untuk semua.
Terima kasih, @arunsrinivasan. Saya menunggu perbaikan ini selama beberapa tahun.
Hebat! Terima kasih