Как лучше всего назначить несколько столбцов с помощью data.table
? Например:
f <- function(x) {c("hi", "hello")}
x <- data.table(id = 1:10)
Я бы хотел сделать что-то подобное (конечно, это неверный синтаксис):
x[ , (col1, col2) := f(), by = "id"]
И чтобы расширить это, у меня может быть много столбцов с именами, хранящимися в переменной (скажем col_names
), и я хотел бы сделать:
x[ , col_names := another_f(), by = "id", with = FALSE]
Как правильно сделать что-то подобное?
by
@Christoph_J, как правильно сказать. Ссылка на ваш вопрос добавлена в FR # 2120 «Отбросьте необходимость with = FALSE для LHS of: =», чтобы его не забыли вернуться.f()
это функция, возвращающая несколько значений, по одному для каждого из ваших столбцов.Ответы:
Теперь это работает в версии 1.8.3 на R-Forge. Спасибо, что подчеркнули это!
Более старая версия, использующая
with
аргумент (мы не рекомендуем этот аргумент, когда это возможно):источник
data.table(objectName=ls())[,c("rows","cols"):=dim(get(objectName)),by=objectName]
(data.table
dim
возвращает вектор, поэтому преобразование его в типlist
должно повернуть его; напр[,c("rows","cols"):=as.list(dim(get(objectName))),by=objectName]
. Проблема в том, чтоas.list
накладные расходы на вызовы также копируют небольшой вектор. Если при увеличении количества групп возникает проблема с эффективностью, сообщите нам об этом.x[,mynames:=list(mean(b)*4,sum(b)*3),by=a,with=FALSE][]
) теперь выдает предупреждение, может быть, удалить его? В связи с этим, кто-нибудь предлагал, чтобыoptions(datatable.WhenJisSymbolThenCallingScope=TRUE)
такое заданиеx[,mynames:=list(mean(b)*4,sum(b)*3),by=a]
действительно работало? Похоже, это согласуется с другими изменениями, хотя я предполагаю, что это может сломать слишком много существующего пользовательского кода (?).by=a
него будет работать, но верните другой ответ.mean(a)
Иsum(a)
агрегаты перерабатывается в пределах каждой группы , когдаby=a
. Безby=a
него просто вставляетmean
иsum
для всего столбца в каждую ячейку (т.е. разные числа).Могут быть полезны следующие сокращенные обозначения. Вся заслуга принадлежит Эндрю Бруксу, особенно этой статье .
источник