通过按 R 中的列值分组来计算总和
Calculate sum by grouping by column value in R
我有一个包含两列的数据框,一个 Ref_Date
列和一个 Value
列。日期列包含每年 12 行,从 1988 年到 2015 年。我需要做的是仅按年份分组并汇总 Value
列,这样我每年只能得到一行包含总和该年 12 个月中每个月的所有值:
row.names Ref_Date Value
166483 1989/01 713
166484 1989/02 771
166485 1989/03 565
166486 1989/04 1248
166487 1989/05 1380
166488 1989/06 1118
166489 1989/07 1026
166490 1989/08 995
166491 1989/09 835
166492 1989/10 939
166493 1989/11 878
166494 1989/12 1075
166495 1990/01 878
166496 1990/02 563
166497 1990/03 773
166498 1990/04 1131
166499 1990/05 1562
166500 1990/06 1747
166501 1990/07 1258
166502 1990/08 791
您可以将以下代码与 dplyr 一起使用:
library(dplyr)
df %>%
group_by(year = substr(Ref_Date, 1, 4)) %>% # create the groups
summarise(Value = sum(Value))
#Source: local data frame [2 x 2]
#
# year Value
#1 1989 11543
#2 1990 8703
或与 data.table
包类似
library(data.table)
setDT(df)[, sum(Value), by = .(year = substr(Ref_Date, 1, 4))]
# year V1
#1: 1989 11543
#2: 1990 8703
或以 R 为基数
with(df, aggregate(Value ~ cbind(year = substr(Ref_Date, 1, 4)), FUN = sum))
# year Value
#1 1989 11543
#2 1990 8703
另一个答案可能如下(通过使用 tapply
):
years <- 1988:2015 ## or first.year:last.year
sums <- tapply(df$Value, substr(df$Ref_Date, 1, 4)), sum)
new.df <- data.frame(years = years, sums = sums)
编辑: 只是避免标准日期的更通用的解决方案(但它基本上与上面发布的类似):
years <- substr(df$Ref_Date, 1, 4)
sums <- tapply(df$Value, years, sum)
new.df <- data.frame(years = unique(years), sum = sums)
我有一个包含两列的数据框,一个 Ref_Date
列和一个 Value
列。日期列包含每年 12 行,从 1988 年到 2015 年。我需要做的是仅按年份分组并汇总 Value
列,这样我每年只能得到一行包含总和该年 12 个月中每个月的所有值:
row.names Ref_Date Value
166483 1989/01 713
166484 1989/02 771
166485 1989/03 565
166486 1989/04 1248
166487 1989/05 1380
166488 1989/06 1118
166489 1989/07 1026
166490 1989/08 995
166491 1989/09 835
166492 1989/10 939
166493 1989/11 878
166494 1989/12 1075
166495 1990/01 878
166496 1990/02 563
166497 1990/03 773
166498 1990/04 1131
166499 1990/05 1562
166500 1990/06 1747
166501 1990/07 1258
166502 1990/08 791
您可以将以下代码与 dplyr 一起使用:
library(dplyr)
df %>%
group_by(year = substr(Ref_Date, 1, 4)) %>% # create the groups
summarise(Value = sum(Value))
#Source: local data frame [2 x 2]
#
# year Value
#1 1989 11543
#2 1990 8703
或与 data.table
包类似
library(data.table)
setDT(df)[, sum(Value), by = .(year = substr(Ref_Date, 1, 4))]
# year V1
#1: 1989 11543
#2: 1990 8703
或以 R 为基数
with(df, aggregate(Value ~ cbind(year = substr(Ref_Date, 1, 4)), FUN = sum))
# year Value
#1 1989 11543
#2 1990 8703
另一个答案可能如下(通过使用 tapply
):
years <- 1988:2015 ## or first.year:last.year
sums <- tapply(df$Value, substr(df$Ref_Date, 1, 4)), sum)
new.df <- data.frame(years = years, sums = sums)
编辑: 只是避免标准日期的更通用的解决方案(但它基本上与上面发布的类似):
years <- substr(df$Ref_Date, 1, 4)
sums <- tapply(df$Value, years, sum)
new.df <- data.frame(years = unique(years), sum = sums)