У меня есть фрейм данных R, как это:
age group
1 23.0883 1
2 25.8344 1
3 29.4648 1
4 32.7858 2
5 33.6372 1
6 34.9350 1
7 35.2115 2
8 35.2115 2
9 35.2115 2
10 36.7803 1
...
Мне нужно получить фрейм данных в следующем виде:
group mean sd
1 34.5 5.6
2 32.3 4.2
...
Номер группы может отличаться, но их имена и количество можно узнать по телефону levels(factor(data$group))
Какие манипуляции нужно выполнить с данными, чтобы получить результат?
r
data-transformation
Юрий Петровский
источник
источник
aggregate
, Аtapply
затем stackoverflow.com для любых последующих вопросов кодирования этого типа.Ответы:
Вот вариант plyr с одной строкой, использующий ddply :
Вот еще один однострочный вариант с использованием нового пакета data.table .
Это быстрее, хотя это заметно только в таблице с 100k строк. Времена на моем Macbook Pro с процессором Core 2 Duo 2,53 ГГц и R 2.11.1:
Дальнейшая экономия возможна, если мы используем
setkey
:источник
dt <- data.table(dtf)
неdt <- data.table(dt)
во втором блоке кода. Таким образом, вы создаете таблицу данных из фрейма данных, а не изdt
функции изstats
пакета. Я пытался редактировать его, но я не могу редактировать под шестью символами.data.table
это лучший способ для агрегирования данных, и этот ответ великолепен, но все же только царапает поверхность. Помимо превосходства по синтаксису, он также чрезвычайно гибок и обладает множеством дополнительных функций, которые включают соединения и внутреннюю механику. Проверьте FAQ, страницу GitHub или курс для получения дополнительной информации.Одной из возможностей является использование агрегатной функции . Например,
дает вам второй столбец желаемого результата.
источник
data.frame(group=levels(factor(data$group)),mean=(aggregate(data$age, by=list(data$group), FUN=mean)$x),sd=(aggregate(data$age, by=list(data$group), FUN=sd)$x))
но я не уверен, что это правильный путь. Я не уверен, что произойдет, тогда результаты связанных столбцов будут в другом порядке (я думаю, что это возможно). Какое у тебя мнение?aggregate()
:aggregate(age ~ group, data=dat, FUN = function(x) c(M=mean(x), SD=sd(x)))
Поскольку вы манипулируете фреймом данных,
dplyr
пакет, вероятно, является более быстрым способом сделать это.или эквивалентно, используя оператор
dplyr
/magrittr
pipe:РЕДАКТИРОВАТЬ полное использование оператора трубы:
источник
dplyr
. Это сделало так много задач R простыми и многие из этих методов устарели.plyr
изdplyr
которого была вызвана функция суммирования, а не вызывающая проблему.Отлично, спасибо bquast за добавление решения dplyr!
Оказывается, что тогда, dplyr и data.table очень близки:
data.table по-прежнему самый быстрый, за ним очень тесно следует dplyr (), что интересно выглядит на data.frame быстрее, чем data.table:
источник
В дополнение к существующим предложениям, вы можете проверить
describe.by
функцию вpsych
пакете.Он предоставляет ряд описательных статистических данных, включая среднее значение и стандартное отклонение на основе группирующей переменной.
источник
Я нашел функцию
summaryBy
в пакете doBy наиболее удобной для этого:источник
Используйте
sqldf
пакет. Это позволяет теперь использовать SQL для обобщения данных. После загрузки вы можете написать что-то вроде -источник
Отредактировано: в соответствии с предложениями ЧЛ
Функция, которую вы ищете, называется «tapply», которая применяет функцию для каждой группы, определенной фактором.
Я действительно предлагаю проработать базовый учебник по R, объясняющий все часто используемые структуры данных и методы. В противном случае вы застрянете каждый дюйм во время программирования. Посмотрите этот вопрос для коллекции бесплатных доступных ресурсов.
источник
for
цикле, вы можете создать свой встроенный кадр данных, IMO. Дляtapply
звонка используйтеfunction(x) c(mean(x),sd(x)))
иcbind
результат, так как ОП запрашивает обе статистики. Такжеddply
из пакета plyr можно было сделать это плавно.cbind("mean"=mperage,"stdev"=stperage) gives no 'group' column. Will be joining by
cbind (группа = уровни (фактор (данные $ группа)), "среднее" = mperage, "stdev" = stperage) `правильно?Вот пример с функцией, которую
aggregates()
я сделал сам некоторое время назад:Это дает следующий результат:
Может быть, вы можете получить тот же результат, начиная с функции R split ():
Позвольте мне вернуться к выводу
aggregates
функции. Вы можете превратить его в красивую таблицу , используяreshape()
,xtabs()
иftable()
:Это дает:
Красиво, не правда ли? Вы можете экспортировать эту таблицу в pdf с
textplot()
функциейgplots
пакета.Смотрите здесь для других решений.
источник