#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