R:如果另一列具有不同的值,如何使用 aggregate() 函数对一列的数据求和?
R: how to use the aggregate()-function to sum data from one column if another column has a distinct value?
嘿嘿
我对聚合函数有疑问。我的数据如下所示:
transect_id year day month LST precipitation
1 TR001 2010 191 4 30.62083 0.0000
2 TR001 2010 191 4 30.62083 0.0003
3 TR001 2010 191 5 30.62083 0.0001
4 TR001 2010 191 7 30.62083 0.0000
5 TR001 2010 191 7 30.62083 0.0000
6 TR001 2011 191 7 30.62083 0.0007
我想对每年每个季度的降水量求和。这意味着:总结每年第 1-3 个月、第 4-6 个月、第 7-9 个月和第 10-12 个月的降水量(在我的例子中是 2010-2013 年)。并为其添加一列。
我认为我应该使用 plyr-package 中的 mutate()-函数,然后执行类似
的操作
weather_gam.mutated<-mutate(weather_gam, precipitation.spring=aggregate(precipitation by = list(Category=year)))
但是这几个月要做什么?我简直想不通。我尝试了 by = list(Category= month==1)
之类的东西,但显然这不是在这里取得成功所需要的。
所以基本上我只是尝试做 SUMIFS(F1:Fx, B1:Bx = "2010", D1:Dx = "1", D1:Dx = "2", D1:Dx = "3"
在 Excel 中会做的事情,只是我希望通过设置
by = list(Category=year)
它会在年份相同时自动求和,所以我不需要每年都手动求和。
我真的很感激这里的任何帮助,如果你有一个完全不同的想法如何解决它。
这是 dplyr
和 lubridate
的解决方案;这个想法是使用 lubridate
的 quarter
函数来找出属于哪个季度的月份。创建 Quarter
列,按季度分组并为每个组创建总和或 precipitation
。
library(lubridate)
library(dplyr)
df$month <- month(df$month)
df %>% mutate(Quarter = quarter(month)) %>% group_by(Quarter) %>% mutate(SumPre = sum(precipitation))
Source: local data frame [6 x 8]
Groups: Quarter
transect_id year day month LST precipitation Quarter SumPre
1 TR001 2010 191 4 30.62083 0e+00 2 4e-04
2 TR001 2010 191 4 30.62083 3e-04 2 4e-04
3 TR001 2010 191 5 30.62083 1e-04 2 4e-04
4 TR001 2010 191 7 30.62083 0e+00 3 7e-04
5 TR001 2010 191 7 30.62083 0e+00 3 7e-04
6 TR001 2011 191 7 30.62083 7e-04 3 7e-04
这里还有另一种方法 aggregate
library(lubridate)
df$month <- month(df$month)
df$Quarter <- quarter(df$month)
aggregate(precipitation ~ Quarter, data = df, sum)
Quarter precipitation
1 2 4e-04
2 3 7e-04
数据
df <- structure(list(transect_id = structure(c(1L, 1L, 1L, 1L, 1L,
1L), .Label = "TR001", class = "factor"), year = c(2010L, 2010L,
2010L, 2010L, 2010L, 2011L), day = c(191L, 191L, 191L, 191L,
191L, 191L), month = c(4L, 4L, 5L, 7L, 7L, 7L), LST = c(30.62083,
30.62083, 30.62083, 30.62083, 30.62083, 30.62083), precipitation = c(0,
3e-04, 1e-04, 0, 0, 7e-04)), .Names = c("transect_id", "year",
"day", "month", "LST", "precipitation"), row.names = c("1", "2",
"3", "4", "5", "6"), class = "data.frame")
使用 dplyr 代替 plyr:
library(dplyr)
d.in %>%
mutate(q=cut(month, c(0,3,6,9,12), labels=c("q1", "q2", "q3", "q4"))) %>%
group_by(year, q) %>%
mutate(sum.prec = sum(precipitation))
嘿嘿 我对聚合函数有疑问。我的数据如下所示:
transect_id year day month LST precipitation
1 TR001 2010 191 4 30.62083 0.0000
2 TR001 2010 191 4 30.62083 0.0003
3 TR001 2010 191 5 30.62083 0.0001
4 TR001 2010 191 7 30.62083 0.0000
5 TR001 2010 191 7 30.62083 0.0000
6 TR001 2011 191 7 30.62083 0.0007
我想对每年每个季度的降水量求和。这意味着:总结每年第 1-3 个月、第 4-6 个月、第 7-9 个月和第 10-12 个月的降水量(在我的例子中是 2010-2013 年)。并为其添加一列。 我认为我应该使用 plyr-package 中的 mutate()-函数,然后执行类似
的操作weather_gam.mutated<-mutate(weather_gam, precipitation.spring=aggregate(precipitation by = list(Category=year)))
但是这几个月要做什么?我简直想不通。我尝试了 by = list(Category= month==1)
之类的东西,但显然这不是在这里取得成功所需要的。
所以基本上我只是尝试做 SUMIFS(F1:Fx, B1:Bx = "2010", D1:Dx = "1", D1:Dx = "2", D1:Dx = "3"
在 Excel 中会做的事情,只是我希望通过设置
by = list(Category=year)
它会在年份相同时自动求和,所以我不需要每年都手动求和。 我真的很感激这里的任何帮助,如果你有一个完全不同的想法如何解决它。
这是 dplyr
和 lubridate
的解决方案;这个想法是使用 lubridate
的 quarter
函数来找出属于哪个季度的月份。创建 Quarter
列,按季度分组并为每个组创建总和或 precipitation
。
library(lubridate)
library(dplyr)
df$month <- month(df$month)
df %>% mutate(Quarter = quarter(month)) %>% group_by(Quarter) %>% mutate(SumPre = sum(precipitation))
Source: local data frame [6 x 8]
Groups: Quarter
transect_id year day month LST precipitation Quarter SumPre
1 TR001 2010 191 4 30.62083 0e+00 2 4e-04
2 TR001 2010 191 4 30.62083 3e-04 2 4e-04
3 TR001 2010 191 5 30.62083 1e-04 2 4e-04
4 TR001 2010 191 7 30.62083 0e+00 3 7e-04
5 TR001 2010 191 7 30.62083 0e+00 3 7e-04
6 TR001 2011 191 7 30.62083 7e-04 3 7e-04
这里还有另一种方法 aggregate
library(lubridate)
df$month <- month(df$month)
df$Quarter <- quarter(df$month)
aggregate(precipitation ~ Quarter, data = df, sum)
Quarter precipitation
1 2 4e-04
2 3 7e-04
数据
df <- structure(list(transect_id = structure(c(1L, 1L, 1L, 1L, 1L,
1L), .Label = "TR001", class = "factor"), year = c(2010L, 2010L,
2010L, 2010L, 2010L, 2011L), day = c(191L, 191L, 191L, 191L,
191L, 191L), month = c(4L, 4L, 5L, 7L, 7L, 7L), LST = c(30.62083,
30.62083, 30.62083, 30.62083, 30.62083, 30.62083), precipitation = c(0,
3e-04, 1e-04, 0, 0, 7e-04)), .Names = c("transect_id", "year",
"day", "month", "LST", "precipitation"), row.names = c("1", "2",
"3", "4", "5", "6"), class = "data.frame")
使用 dplyr 代替 plyr:
library(dplyr)
d.in %>%
mutate(q=cut(month, c(0,3,6,9,12), labels=c("q1", "q2", "q3", "q4"))) %>%
group_by(year, q) %>%
mutate(sum.prec = sum(precipitation))