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

时间:2015-05-19 15:43:05

标签: r dplyr

我想计算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等统计信息。 )

1 个答案:

答案 0 :(得分:3)

作为一次性表格。这在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中的所有操作均按照&#34;按组完成。&#34;
  • 我们可以按照组&#34;嵌套另一个&#34;使用 D ata,data.table的当前 S ubset的.SD
  • 要返回j中的列,我们使用.(colname1=col1,colname2=col2,...)

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

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

然后我们可以查看汇总表:

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放置一些内容,因此我使用&#34;按组&#34;代码.GRP。)