R,参考列中所有值的汇总求和(而不仅仅是一个)

时间:2017-08-31 21:37:18

标签: r aggregate average mean

我尝试了几种不同的方法来获得平均值的摘要表半小时,类似于平均数据透视表。我首选的方法是使用聚合,但我似乎只得到顶行的平均值。

数据如链接所示,其中可以忽略组和消息。 See below.

我正在使用的代码是......

Data <- read_csv("P:/Book3.csv", col_types = cols(Date = col_date(format = "%m/%d/%Y"), 
                                                  Time = col_time(format = "%H:%M:%S")))
View(Data)

class(Data)
[1] "tbl_df"     "tbl"        "data.frame"

aggregate(Data[, 3:4], list(Data$Time), mean)

   Group.1    Calls Estimated_Calls
1 08:30:00 15.38889        14.55556

您会注意到单行,但理想情况下,输出每次都会有平均值。

任何帮助都会很棒。感谢。

2 个答案:

答案 0 :(得分:0)

我更喜欢使用data.table进行摘要操作:

setDT(Data)

Data[, .(Mean_Calls = mean(Calls), Mean_Est_Calls = mean(Estimated_Calls)),
    by=.(Group, Time)]

这将按组和时间分组,这意味着您将为每个组和时间组合分配一行。

使用虚拟数据(时间使用3“小时”;还将by更改为keyby以进行排序):

set.seed(48)

df1 <- data.table(Group = sample(LETTERS[1:3],10,T),
 Time = sample(1:3,10,T),
 Calls = sample(1:50,10,T),
 Estimated_Calls = sample(1:50,10,T))

df1[, .(Mean_Calls = mean(Calls), Mean_Est_Calls = mean(Estimated_Calls)),
        keyby=.(Group, Time)]

输出:

   Group Time Mean_Calls Mean_Est_Calls
1:     A    2   27.00000       22.00000
2:     A    3   34.66667       25.66667
3:     B    2   26.00000        6.50000
4:     B    3   20.00000        1.00000
5:     C    2   35.50000       32.00000

使用aggregate

df2 <- aggregate(df1[,3:4], by=with(df1,list(Group,Time)),mean)

答案 1 :(得分:0)

我喜欢使用dplyr库来解决这类问题:

library(dplyr)
Data %>% group_by(Time) %>% 
    summarise(Mean_Calls = mean(Calls), Mean_Est_Calls = mean(Estimated_Calls))

我发现管道%>%使代码更容易阅读(一旦你习惯它)。这是dplyr库的一项功能。