Представлено: Мэттом Веллером; Присвоено: никому; Ссылка на 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.
Еще одно сообщение для обновления: 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. Я ждал этого исправления пару лет.
Потрясающие! Спасибо