Используйте другие столбцы с .SD в data.table

#r #data.table

Вопрос:

Я пытаюсь объединить .SD с некоторыми другими столбцами в операции суммирования, но это приводит к неверным результатам (для моей цели). Для (глупого) примера:

 library(data.table)  t lt;- as.data.table(mtcars)  t[, list(cyl = sum(cyl), lapply(.SD, mean)), .SDcols = c('mpg', 'disp')]  

Я бы хотел, чтобы это возвращало таблицу data.table с 1 строкой и 3 столбцами, но вместо этого она возвращает столбец с 2 строками и 2 столбцами. Есть ли способ обойти это?

Комментарии:

1. Пожалуйста, потратьте время на изучение документации и большой коллекции примеров в ?data.table и .SD . Там вы бы нашли: DT[, c(.N, lapply(.SD, sum)), by=x] ; DT[, c(.(y=max(y)), lapply(.SD, min)), by=rleid(v), .SDcols=v:b] . Овации

Ответ №1:

Проблема в том, что list(cyl, lapply(.)) это возвращает что-то, что на самом деле не похоже на фрейм. Если вы посмотрите на это за пределами окружающей data.table среды, это выглядит так:

 str(list(cyl = sum(t$cyl), lapply(t[,c("mpg","disp")], mean))) # List of 2 # $ cyl: num 198 # $ :List of 2 # ..$ mpg : num 20.1 # ..$ disp: num 231  

когда лучшее возвращение будет выглядеть примерно так:

 str(c(list(cyl = sum(t$cyl)), lapply(t[,c("mpg","disp")], mean))) # List of 3 # $ cyl : num 198 # $ mpg : num 20.1 # $ disp: num 231  

Вместо c этого необходимо объединить два списка:

 t[, c(list(cyl = sum(cyl)), lapply(.SD, mean)), .SDcols = c('mpg', 'disp')] # cyl mpg disp # lt;numgt; lt;numgt; lt;numgt; # 1: 198 20.09062 230.7219  

или просто добавьте числовое sum(cyl) lapply значение в список (спасибо Брайанмонтгомери):

 t[, c(cyl = sum(cyl), lapply(.SD, mean)), .SDcols = c('mpg', 'disp')]  

Комментарии:

1. Или просто t[, c(cyl = сумма(cyl), lapply(.SD, среднее значение)),. SDcols = c(‘mpg’, ‘disp’)]

Ответ №2:

С помощью append

 setnames(t[, append(sum(cyl), lapply(.SD, mean)), .SDcols = c('mpg', 'disp')], 1, 'cyl')[]  cyl mpg disp 1: 198 20.09062 230.7219