因此,我有一个数据框,其中有一个日期列,一个小时列和一系列其他数字列。数据框中的每一行是一年中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
来汇总值,但我也可以是mean
,max
或您自己编写的某些函数。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)
在这里,我向包含月份的数据添加了一个新列,然后按该列进行汇总。