2015-05-30 44 views
7

因此,我有一个数据框,其中包含日期列,小时列和一系列其他数字列。数据框中的每一行是整整一年1天的1小时。在R中按月总结行数

数据帧看起来像这样:

  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 

营业时间是无序因为这是从另一数据帧子集。

我想按月和可能每天在数值列中总结值。有谁知道我该怎么做?

回答

7

我创建的数据通过

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的变量。

对于按月汇总,我使用了包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) 

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

+0

我得到的错误图书馆(lubridate)线。 Doi需要手动导入包吗? – user2787386

+1

你先安装了它吗? '安装。软件包(“lubridate”)' –

+0

抱歉...你需要按照@Marta Cz-C的说明安装软件包。 – Stibu

7

这可能是另一种方式来做到这一点使用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

你的dplyr解决方案在data.table中的等价物就是:'setDT(data)[,lapply(.SD,sum),by = Date]' – Arun

+0

是的,谢谢Arun。我现在会做出改变。 –

4

另一个基础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