因此,我有一个数据框,其中有一个日期列,一个小时列和一系列其他数字列。数据框中的每一行是一年中1天的1小时。

数据框如下所示:

          Date  Hour  Melbourne  Southern  Flagstaff
1   2009-05-01     0          0         5         17
2   2009-05-01     2          0         2          1
3   2009-05-01     1          0        11          0
4   2009-05-01     3          0         3          8
5   2009-05-01     4          0         1          0
6   2009-05-01     5          0        49         79
7   2009-05-01     6          0       425        610


这些小时是乱序的,因为这是从另一个数据帧中得出的。

我想按月份,也可能按天,对数字列中的值求和。有人知道我该怎么做吗?

最佳答案

我创建数据集

data <- read.table( text="   Date    Hour    Melbourne   Southern    Flagstaff
                       1   2009-05-01  0   0   5   17
                       2   2009-05-01  2   0   2   1
                       3   2009-05-01  1   0   11  0
                       4   2009-05-01  3   0   3   8
                       5   2009-05-01  4   0   1   0
                       6   2009-05-01  5   0   49  79
                       7   2009-05-01  6   0   425 610",
                    header=TRUE,stringsAsFactors=FALSE)


您可以使用函数aggregate进行求和:

byday <- aggregate(cbind(Melbourne,Southern,Flagstaff)~Date,
             data=data,FUN=sum)
library(lubridate)
bymonth <- aggregate(cbind(Melbourne,Southern,Flagstaff)~month(Date),
             data=data,FUN=sum)


查看?aggregate可以更好地理解该功能。从最后一个参数开始(因为这使解释更加容易),这些参数执行以下操作:


FUN是应用于聚合的功能。我使用sum来汇总值,但我也可以是meanmax或您自己编写的某些函数。
data用于指示我要聚合的数据帧。
第一个参数告诉函数我到底要聚合什么。在~的左侧,指示要聚合的变量。如果不止一个,则将它们与cbind组合。右侧是变量,应通过该变量拆分数据。放入Date意味着合计将汇总Date的每个不同值的变量。


对于按月汇总,我使用了包month中的函数lubridate。它会执行预期的操作:它返回一个数字值,该数字值指示给定日期的月份。也许您首先需要通过install.packages("lubridate")安装该软件包。

如果您不想使用lubridate,则可以执行以下操作:

data <- transform(data,month=as.numeric(format(as.Date(Date),"%m")))
bymonth <- aggregate(cbind(Melbourne,Southern,Flagstaff)~month,
                     data=data,FUN=sum)


在这里,我向包含月份的数据添加了一个新列,然后按该列进行汇总。

08-07 18:51
查看更多