Data.table: [R-Forge # 5222] 'не найден', когда DT [, list (sum (non-.SD-col), lapply (.SD, mean)), by = ..., .SDcols = ...]

Созданный на 8 июн. 2014  ·  12Комментарии  ·  Источник: Rdatatable/data.table

Представлено: Мэттом Веллером; Присвоено: никому; Ссылка на R-Forge

При использовании .SDcols (с целью применения функции к нескольким столбцам) я не могу ссылаться на другие столбцы в исходной таблице (v1), используя следующий синтаксис:

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

Аналогичная ошибка возникает, когда я использую c вместо списка, очевидно, что столбец v1 не может быть доступен в предложении j .

Я прибег к следующему коду, который включает столбец v1, хотя я не хочу, чтобы он был включен в часть lapply , и мне пришлось отбросить его после вычисления.

sd.cols = c("v1","v2", "v3")
dt.out = dt[, c(sum.v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]

Согласно eddi на Stackoverflow, это ошибка, и он попросил меня сообщить об этом. Я не могу предоставить более подробную информацию, поскольку я не совсем уверен, какая часть, по его мнению, была ошибкой, глядя на принятый ответ Аруна, и их последующее обсуждение подчеркнет, где, но проблема.

Вот соответствующий пост SO.

High bug

Все 12 Комментарий

Еще одно сообщение для обновления: http://stackoverflow.com/questions/27755518/data-table-sd-lapply-multiple-columns-in-argument

Немного поздно, но добавляю этот мой вопрос в кучу

Я даже не думал об этом как об ошибке, обычно я добавляю дополнительные обязательные поля в .SDcols а позже в j я использую .SD[, !"total", with=FALSE] чтобы исключить ненужный столбец.

Это еще один хороший обходной путь, мне интересно узнать разницу в производительности по сравнению с использованием dt$total . И да, это своего рода танец грани между FR и ошибкой, ИМО.

Поднимаю это снова. Похоже, это может быть очень важным исправлением. этот вопрос кажется связанным и потенциально может быть решен с помощью DT[, (deltaColsNewNames) := lapply(.SD, normalDelta, price), .SDcols = deltaColsNames]

Вот еще один простой случай, когда это будет полезно: http://stackoverflow.com/a/32498711/1191259

Вот еще один простой случай, который страдает: http://stackoverflow.com/questions/32944060/using-data-table-to-calculate-new-columns/32944519#32944519

Другой для обновления после исправления: http://stackoverflow.com/q/32915770/1191259

Ура! теперь мы можем сделать это:

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

Обновлены все сообщения SO, указанные здесь. Спасибо всем.

Спасибо, @arunsrinivasan. Я ждал этого исправления пару лет.

Потрясающие! Спасибо

Была ли эта страница полезной?
0 / 5 - 0 рейтинги