R 计算组和总体统计数据的干净方法

R 计算组和总体统计数据的干净方法,r,dplyr,R,Dplyr,我不仅要计算不同数据组的中值,还要计算所有组的中值,并将结果存储在单个数据框中。虽然分别完成这些任务很容易,但我还没有找到一种干净的方法同时完成这两项任务 现在,我要做的是分别计算这两个统计数据;然后加入结果;如有必要,整理数据。如果我想知道每天和每月的延迟中值,下面是一个示例: library(dplyr) library(hflights) data(hflights) # Calculate both statistics separately per_day <- hfligh

我不仅要计算不同数据组的
中值
,还要计算所有组的
中值
,并将结果存储在单个
数据框中。虽然分别完成这些任务很容易,但我还没有找到一种干净的方法同时完成这两项任务

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

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
# ..  ...   ...        ...       ...      ...
库(dplyr)
图书馆(hflights)
数据(hflights)
#分别计算这两个统计数据
每天%
分组单位(年、月、月日)%>%
总结(延迟=平均值(ArrDelay,na.rm=真))%>%
变异(Interval=“Daily”)
每月%
分组单位(年、月)%>%
总结(延迟=平均值(ArrDelay,na.rm=真))%>%
变异(Interval=“Monthly”,DayofMonth=NA)
#连接到单个data.frame中

我的总结是一个一次性的表格。这在
数据中非常简单。表格

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
然后我们可以查看汇总表:

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
中放入一些内容,因此我使用了“按组”代码,
.GRP

而不是
摘要
,您可以
变异
,然后
取消分组
,然后在下一个之前重新分组。没有示例数据就无法进行测试。谢谢,弗兰克。我将代码更改为使用
hflights
数据集。另外,我很感谢你的建议。但是你认为这会更有效吗?嗯,我不太了解如何使
dplyr
代码更有效;我使用
data.table
来实现这一点。我刚才在想,也许您想在一个
%%>%%
链中计算这两个统计信息。是的,一个
%%>%%
就很好了,但我认为如果这两个步骤分开,代码的可读性会更好。因为似乎没有一种“标准”的方式来做我想做的事情,让我这样说:我更喜欢一致和高效的代码,而不是
dplyr
。因此,如果
data.table
是执行此任务的更好选择,我很高兴看到您的方法。好的,我添加了
data.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