Как можно обобщить вывод из plyr, а не долго? - PullRequest
3 голосов
/ 10 марта 2011

Мне нравится способность plyr разбивать фрейм данных на несколько наборов данных, а затем выполнять идентичные операции с каждым набором. Самая лучшая часть - это когда вы показываете результат в виде аккуратного компактного стола с хорошей маркировкой. Я люблю бросать кучу вычислений в одну строку, используя каждый (). Тем не менее, я не понимаю, почему использование функции подведения итогов в аргументе ddply перекрывает вывод и делает его длинным и без меток. Посмотрите здесь, чтобы понять, что я имею в виду. Можете ли вы сказать мне, что я делаю не так? Я предпочитаю использовать суммирование.

Давайте сначала настроим пример фрейма данных. Представьте, что у вас было 60 участников в исследовании. 20 из них были забавными, 20 умными и 20 милыми. Затем каждый субъект получил оценку.

type<-rep(c("funny","clever", "nice"),20)
score<-rnorm(60)+10
data<-data.frame(type,score)

Теперь мне нужна таблица, показывающая средний балл, медианный балл, минимальный балл и максимальный балл для каждого из 3 типов людей

ddply(data,.(type), summarise, each(mean,median,min,max)(score))

В приведенной выше строке должна была быть хорошая таблица (3 строки - 1 для каждого типа и 4 столбца данных). Увы, он дает всю длинную таблицу с одним столбцом чисел, ни один из которых не помечен.

ddply(data,.(type), function(jjkk) each(mean,median,min,max)(jjkk$score))

Приведенная выше строка дает мне то, что я хочу. Не могли бы вы объяснить, что я не понимаю в синтаксисе ddply.

Ответы [ 2 ]

5 голосов
/ 10 марта 2011

Описание функций в следующем виде:

ddply(data,"type", summarise, mean=mean(score),median=median(score),max=max(score),min=min(score))

производит вывод в нужном формате.

Я думаю, что ваша проблема в том, что each() возвращает вектор, который summarize() не совсем так, как вы намереваетесь.

4 голосов
/ 10 марта 2011

Хммм ... Я слишком устал думать об однострочнике, но reshape справится с задачей:

library(reshape)
library(plyr)
mdtf <- melt(data)
cast(mdtf, type ~ ., each(min, max, mean, median))
    type      min      max      mean   median
1 clever 7.808648 12.08930 10.125563 10.27269
2  funny 8.302777 12.04066  9.941331 10.07333
3   nice 8.442508 11.80132 10.085667 10.07261
...