在R中按月对行求和

Posted

技术标签:

【中文标题】在R中按月对行求和【英文标题】:Summing rows by month in R 【发布时间】:2015-08-13 04:28:44 【问题描述】:

所以我有一个数据框,它有一个日期列、一个小时列和一系列其他数字列。数据框中的每一行是全年 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

小时数不正常,因为这是从另一个数据帧中提取的子集。

我想按月和可能按天对数字列中的值求和。有谁知道我该怎么做?

【问题讨论】:

【参考方案1】:

我会使用 dplyr::summarize 和 group_by,为每个数字列加上总和:

summarize(group_by(df, Date), m_count = sum(Melbourne), s_count = sum(Southern), f_count = sum(Flagstaff)

【讨论】:

【参考方案2】:

这可能是使用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

【讨论】:

相当于你的 dplyr 解决方案在 data.table 中只是:setDT(data)[, lapply(.SD, sum), by=Date] 确实如此!谢谢阿伦。我现在将进行更改。【参考方案3】:

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

【讨论】:

【参考方案4】:

我创建的数据集由

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 意味着聚合将对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) 行上遇到错误。需要手动导入包吗? 你先安装了吗? install.packages("lubridate") 抱歉...是的,您必须按照@Marta Cz-C 的说明安装软件包。 我添加了一个不依赖 lubridate 的解决方案。 完美运行。非常感谢。

以上是关于在R中按月对行求和的主要内容,如果未能解决你的问题,请参考以下文章

如何根据多个条件对行求和 - R? [复制]

如何在 Pandas 中按月计算分类列?

如何在 MySQL 中对行进行求和

mysql 行转列,对列的分组求和,对行求和

Handsontable:如何对行求和?

如何根据 SQL 中的分区对行求和?