Ответ 1
Я поставлю свои два цента за tapply()
.
tapply(df$dt, df$group, summary)
Вы можете написать настраиваемую функцию со специальной статистикой, которую хотите заменить сводкой.
Я пытаюсь получить несколько сводных статистических данных в R/S-PLUS, сгруппированных по категориальным столбцам в одном кадре. Я нашел пару функций, но все они делают одну статистику за вызов, как 'aggregate().
data <- c(62, 60, 63, 59, 63, 67, 71, 64, 65, 66, 68, 66,
71, 67, 68, 68, 56, 62, 60, 61, 63, 64, 63, 59)
grp <- factor(rep(LETTERS[1:4], c(4,6,6,8)))
df <- data.frame(group=grp, dt=data)
mg <- aggregate(df$dt, by=df$group, FUN=mean)
mg <- aggregate(df$dt, by=df$group, FUN=sum)
То, что я ищу, - это получить несколько статистических данных для одной и той же группы, таких как среднее, минимальное, максимальное, стандартное... и т.д. За один вызов.
Я поставлю свои два цента за tapply()
.
tapply(df$dt, df$group, summary)
Вы можете написать настраиваемую функцию со специальной статистикой, которую хотите заменить сводкой.
Пакет dplyr может быть хорошей альтернативой этой проблеме:
library(dplyr)
df %>%
group_by(group) %>%
summarize(mean = mean(dt),
sum = sum(dt))
Чтобы получить 1-й квадрант и 3-й квадрант
df %>%
group_by(group) %>%
summarize(q1 = quantile(dt, 0.25),
q3 = quantile(dt, 0.75))
Использование пакета Hadley Wickham purrr это довольно просто. Используйте split
для разделения пройденного data_frame
на группы, затем используйте map
для применения функции summary
к каждой группе.
library(purrr)
df %>% split(.$group) %>% map(summary)
Здесь много разных способов, но я неполный к describeBy
в пакете psych
:
describeBy(df$dt, df$group, mat = TRUE)
взгляните на пакет plyr
. В частности, ddply
ddply(df, .(group), summarise, mean=mean(dt), sum=sum(dt))
Кроме describeBy
, то doBy
пакет представляет собой другой вариант. Он обеспечивает большую часть функциональности SAS PROC РЕЗЮМЕ. Подробности: http://www.statmethods.net/stats/descriptives.html
через 5 долгих лет я уверен, что для этого ответа не будет особого внимания, но для того, чтобы все варианты были завершены, вот один из data.table
library(data.table)
setDT(df)[ , list(mean_gr = mean(dt), sum_gr = sum(dt)) , by = .(group)]
# group mean_gr sum_gr
#1: A 61 244
#2: B 66 396
#3: C 68 408
#4: D 61 488
Я просто нашел замечательный пакет R tables. Вы можете суммировать данные по нескольким категориям, как вам хочется, и вычислять множество статистических данных для нескольких переменных - это действительно потрясающе!
Но подождите, там еще! Пакет имеет функции для генерации кода LaTeX для ваших таблиц для легкого импорта в ваши документы.
Во-первых, это зависит от вашей версии R. Если вы прошли 2.11, вы можете использовать aggreggate с несколькими функциями результатов (сводка, например, или ваша собственная функция). Если нет, вы можете использовать ответ, сделанный Джастином.
Хотя некоторые другие подходы работают, это довольно близко к тому, что вы делали, и использует только base r. Если вы знаете команду aggregate, это может быть более интуитивно понятно.
with( df , aggregate( dt , by=list(group) , FUN=summary) )
Стоит взглянуть на таблицу: https://cran.r-project.org/web/packages/tableone/vignettes/introduction.html