Data.table: [R-Forge # 5222] 'tidak ditemukan' ketika DT [, daftar (jumlah (non-.SD-col), lapply (.SD, mean)), oleh = ..., .SDcols = ...]

Dibuat pada 8 Jun 2014  ·  12Komentar  ·  Sumber: Rdatatable/data.table

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.

High bug

Semua 12 komentar

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

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat