2015-05-30 47 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