在 R 中按月汇总行
Summing rows by month in R
所以我有一个数据框,其中包含日期列、小时列和一系列其他数字列。数据框中的每一行是一整年的 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
. 的每个不同值的变量求和
为了按月汇总,我使用了包 lubridate
中的函数 month
。它做了人们期望的事情:它 returns 一个数值,表示给定日期的月份。也许您首先需要通过 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)
在这里,我向包含月份的数据添加了一个新列,然后按该列进行汇总。
这可能是使用 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
另一个基础 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
我会使用 dplyr::summarize 和 group_by,每个数字列的总和:
summarize(group_by(df, Date), m_count = sum(Melbourne), s_count = sum(Southern), f_count = sum(Flagstaff)
所以我有一个数据框,其中包含日期列、小时列和一系列其他数字列。数据框中的每一行是一整年的 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
. 的每个不同值的变量求和
为了按月汇总,我使用了包 lubridate
中的函数 month
。它做了人们期望的事情:它 returns 一个数值,表示给定日期的月份。也许您首先需要通过 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)
在这里,我向包含月份的数据添加了一个新列,然后按该列进行汇总。
这可能是使用 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
另一个基础 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
我会使用 dplyr::summarize 和 group_by,每个数字列的总和:
summarize(group_by(df, Date), m_count = sum(Melbourne), s_count = sum(Southern), f_count = sum(Flagstaff)