在R中按月份汇总行的总和

14

我有一个数据框,其中包括一个日期列、一个小时列和一系列其他数字列。每一行代表一整天中的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

由于这是从另一个数据框中进行子集操作,所以小时数是无序的。

我想按月份和可能按天数总结数字列中的值。有人知道我该如何做吗?

4个回答

12

我通过以下方式创建数据集:

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表示聚合将对每个不同的日期值总结变量。

对于按月聚合,我使用了包lubridate中的month函数。它执行我们期望的操作:返回给定日期的月份的数值。也许您需要通过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)

我在数据中添加了一个包含月份的新列,然后按照该列进行了聚合。


我在library(lubridate)这一行遇到了错误。我需要手动导入这个包吗? - user2787386
1
你先安装了吗?install.packages("lubridate") - Marta Cz-C
抱歉...是的,您必须按照@Marta Cz-C的描述安装该软件包。 - Stibu
我添加了一个不依赖于"Lubridate"的解决方案。 - Stibu
完美地工作了。非常感谢您。 - user2787386

9
这可能是使用data.table实现的另一种方式。
library(data.table)
# Edited as per Arun's comment
out = setDT(data)[, lapply(.SD, sum), by=Date] 

#>out
#         Date Hour Melbourne Southern Flagstaff
#1: 2009-05-01   21         0      496       715

或者使用dplyr

library(dplyr)
out = data %>% group_by(Date) %>% summarise_each(funs(sum))

#>out
#Source: local data frame [1 x 5]
#        Date Hour Melbourne Southern Flagstaff
#1 2009-05-01   21         0      496       715

3
在data.table中,与您的dplyr解决方案相当的代码只需是:setDT(data)[, lapply(.SD, sum), by=Date] - Arun
是的确如此!谢谢Arun。我现在会进行修改。 - Veerendra Gadekar

8

另一个基于R语言的解决方案

# to sum by date
rowsum(dat[-1], dat$Date)
#           Hour Melbourne Southern Flagstaff
#2009-05-01   21         0      496       715

# or by month and year
rowsum(dat[-1], format(dat$Date, "%b-%y") )
#       Hour Melbourne Southern Flagstaff
#May-09   21         0      496       715

0
我会使用dplyr::summarize和group_by函数,对每个数值列进行求和:
summarize(group_by(df, Date), m_count = sum(Melbourne), s_count = sum(Southern), f_count = sum(Flagstaff)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接