use*_*386 10 aggregate r dataframe lubridate dplyr
所以我有一个数据框,它有一个日期列,一个小时列和一系列其他数字列.数据框中的每一行是一整天的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
Run Code Online (Sandbox Code Playgroud)
小时数无序,因为这是从另一个数据框中的子集.
我想按月和可能按天将数值中的值相加.有谁知道我怎么做到这一点?
Sti*_*ibu 10
我创建了数据集
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)
Run Code Online (Sandbox Code Playgroud)
你可以用函数做总结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)
Run Code Online (Sandbox Code Playgroud)
看看?aggregate更好地理解这个功能.从最后一个参数开始(因为这使得解释更容易)参数执行以下操作:
FUN是应该用于聚合的函数.我sum用来总结这些值,但我也可以mean,max或者你自己写的一些函数.data 用于指示我想要聚合的数据框.~,我指出了我想要聚合的变量.如果有多个,则将它们合并cbind.右侧是应该分割数据的变量.Putting 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)
Run Code Online (Sandbox Code Playgroud)
在这里,我为包含月份的数据添加了一个新列,然后由该列聚合.
这可能是使用它的另一种方法 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
Run Code Online (Sandbox Code Playgroud)
或者通过使用 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
Run Code Online (Sandbox Code Playgroud)
另一个基本的 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13757 次 |
| 最近记录: |