计算组和整体统计数据的简洁方法

Clean way to calculate both group and overall statistics

我不仅想为我的不同数据组计算 median,而且想计算所有组的 median,并将结果存储在单个 data.frame 中。虽然分别完成这些任务很容易,但我还没有找到同时完成这两项任务的简洁方法。

现在,我正在做的是分别计算这两个统计数据;然后加入结果;然后在必要时整理数据。如果我想知道每天 和每月 的平均延迟时间,下面是一个示例:

library(dplyr)
library(hflights)

data(hflights)

# Calculate both statistics separately
per_day <- hflights %>% 
  group_by(Year, Month, DayofMonth) %>%
  summarise(Delay = mean(ArrDelay, na.rm = TRUE)) %>%
  mutate(Interval = "Daily")

per_month <- hflights %>% 
  group_by(Year, Month) %>%
  summarise(Delay = mean(ArrDelay, na.rm = TRUE)) %>%
  mutate(Interval = "Monthly", DayofMonth = NA)

# Join into a single data.frame
my_summary <- full_join(per_day, per_month,
                        by = c("Year", "Month", "DayofMonth", "Interval", "Delay"))

my_summary
# Source: local data frame [377 x 5]
# Groups: Year, Month
# 
# Year Month DayofMonth     Delay Interval
# 1  2011     1          1 10.067642    Daily
# 2  2011     1          2 10.509745    Daily
# 3  2011     1          3  6.038627    Daily
# 4  2011     1          4  7.970740    Daily
# 5  2011     1          5  4.172650    Daily
# 6  2011     1          6  6.069909    Daily
# 7  2011     1          7  3.907295    Daily
# 8  2011     1          8  3.070140    Daily
# 9  2011     1          9 17.254325    Daily
# 10 2011     1         10 11.040388    Daily
# ..  ...   ...        ...       ...      ...

有更好的方法吗?

(请注意,在许多情况下,人们可以轻松地逐步汇总摘要,如 Introduction to dplyr 中所指出的那样。但是,这不适用于 medianmean 等统计信息等等)

作为一次性 table. 这在 data.table:

中相当简单
require(data.table)

setDT(hflights)[,{
  mo_del <- mean(ArrDelay,na.rm=TRUE)
  .SD[,.(DailyDelay = mean(ArrDelay,na.rm=TRUE),MonthlyDelay = mo_del),by=DayofMonth]
},by=.(Year,Month)]
  #    Year Month DayofMonth DailyDelay MonthlyDelay
  # 1: 2011     1          1 10.0676417     4.926065
  # 2: 2011     1          2 10.5097451     4.926065
  # 3: 2011     1          3  6.0386266     4.926065
  # 4: 2011     1          4  7.9707401     4.926065
  # 5: 2011     1          5  4.1726496     4.926065
 # ---                                              
# 361: 2011    12         14  1.0293610     5.013244
# 362: 2011    12         17 -0.1049822     5.013244
# 363: 2011    12         24 -4.1457490     5.013244
# 364: 2011    12         25 -2.2976827     5.013244
# 365: 2011    12         31 46.4846491     5.013244

它是如何工作的。 基本语法是 DT[i,j,by]

  • 对于 by=.(Year,Month)j 中的所有操作均按 "by group."
  • 完成
  • 我们可以使用Data的当前S子集的data.table嵌套另一个"by group", .SD.
  • 对于 j 中的 return 列,我们使用 .(colname1=col1,colname2=col2,...)

创建新变量。 或者,我们可以使用 j 中的 :=hflights 中创建新变量。

hflights[,DailyDelay   := mean(ArrDelay,na.rm=TRUE),.(Year,Month,DayofMonth)]
hflights[,MonthlyDelay := mean(ArrDelay,na.rm=TRUE),.(Year,Month)]

然后我们可以查看摘要table:

hflights[,.GRP,.(Year,Month,DayofMonth,DailyDelay,MonthlyDelay)]
  #    Year Month DayofMonth DailyDelay MonthlyDelay .GRP
  # 1: 2011     1          1 10.0676417     4.926065    1
  # 2: 2011     1          2 10.5097451     4.926065    2
  # 3: 2011     1          3  6.0386266     4.926065    3
  # 4: 2011     1          4  7.9707401     4.926065    4
  # 5: 2011     1          5  4.1726496     4.926065    5
 # ---                                                   
# 361: 2011    12         14  1.0293610     5.013244  361
# 362: 2011    12         17 -0.1049822     5.013244  362
# 363: 2011    12         24 -4.1457490     5.013244  363
# 364: 2011    12         25 -2.2976827     5.013244  364
# 365: 2011    12         31 46.4846491     5.013244  365

(这里j需要加一些东西,所以我用了"by group"代码,.GRP。)