2014-11-10 4 views
4

Я хочу обобщить несколько переменных в data.table, выводить в широком формате, выводить, возможно, как список на переменную. Поскольку несколько других подходов не сработало, я попытался сделать внешнюю латентность, указав имена переменных как символьные векторы. Я хотел передать их, используя = FALSE.data.table: Использование с = False и преобразование функции/итоговой функции?

carsx=as.data.table(cars) 
lapply(list(speed="speed",dist= "dist"), #error object 'ansvals' not found 
    function(x) carsx[,list(mean(x), min(x), max(x)), with=FALSE ]) 

Поскольку это не сработало, я попробовал более простой подход без лаппли.

carsx[,list(mean("speed"), min("speed"), max("speed")), with=FALSE ] #error object 'ansvals' not found 

Это также не работает. Есть ли способ сделать что-то подобное? Это поведение «с» нужно? (Я знаю, что ?data.table упоминает лишь выбрать столбцы, но в моем случае это было бы полезно, чтобы иметь возможность трансформировать их, а)

Когда с = FALSE, J представляет собой вектор имен или позиций выберите, аналогично data.frame. with = FALSE часто полезно в data.table для динамического выбора столбцов.

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

carsx[,list(mean(speed), min(speed), max(speed)) ,by=(dist>50) 

С сожалением СО не позвольте мне опубликовать мой другой вопрос. Там я описал, что я хочу, выходной похож на:

lapply(list(speed="speed",dist= "dist"), 
     function(x) do.call("as.data.frame", aggregate(cars[,x], list(class=cars$dist>50), FUN=summary))) 

Ожидаемый результат будет что-то вроде:

$speed 
     V1  V2 V3 
1: FALSE 12.96970 4 20 
2: TRUE 20.11765 14 25 

$dist 
     V1  V2 V3 
1: FALSE 12.96970 4 20 
2: TRUE 20.11765 14 25 
+0

Я хочу, чтобы получить суммарную статистику в широком формате, возможно, в списке на (сгруппированных) переменной. Для этого я попробовал внешний лап, и поэтому ответ Свенса тоже не подходит для меня ... – Julian

+0

Я группирую (dist> 50) – Julian

ответ

1

здание на Svens отвечает комбинация .SDcols, rbindlist, а также внешняя и внутренняя lapply сделали трюк. Внутренний латентный доступ необходим для доступа .SD.

lapply(list(speed="speed",dist= "dist"), 
    function(x) carsx[ , rbindlist(lapply(.SD, function(x) list(mean=mean(x), min=min(x), max=max(x)))), 
         .SDcols = x,by= (dist>50)]) 

Результат:

$speed 
    dist  mean min max 
1: FALSE 12.96970 4 20 
2: TRUE 20.11765 14 25 

$dist 
    dist  mean min max 
1: FALSE 27.84848 2 50 
2: TRUE 72.35294 52 120 
2

Вы можете указать столбцы с .SDcols параметра:

carsx[ , lapply(.SD, function(x) c(mean(x), min(x), max(x))), 
     .SDcols = c("speed", "dist")] 
# speed dist 
# 1: 15.4 42.98 
# 2: 4.0 2.00 
# 3: 25.0 120.00 

carsx[ , lapply(.SD, function(x) c(mean(x), min(x), max(x))), 
     .SDcols = "speed"] 
# speed 
# 1: 15.4 
# 2: 4.0 
# 3: 25.0