如何按日期对列表中的数据进行分组并计算 R 中关联数据值的平均值?
How do I group data in a list by date and average the associated data values in R?
我想按日期(每天)对下面的数据进行分组,并获取每组的平均值。
下面创建的数据集是 3 维数组,其中 i= 时间(以天为单位),j= 纬度和 k= 经度。此数据集的长度为 4 年(1461 天),并具有属性 'Dates' 来表示每个 days/dates。我想表示 'Data' 中的数据,以便我最终得到 1 月 1 日、1 月 2 日等的一个平均值
#First create the example dataset
tmintest=array(1:100, c(420,189,1461))
#create the list
Variable <- list(varName="rr")
Data = tmintest
xyCoords <- list(x = seq(-40.37,64.37,length.out=420), y = seq(25.37,72.37,length.out=189))
Dates <- list(start = seq(as.Date("2012-01-01"), as.Date("2015-12-31"), by="days"), end=seq(as.Date("2012-01-01"), as.Date("2015-12-31"), by="days"))
All <- list(Variable = Variable,Data=aperm(Data), xyCoords=xyCoords,Dates=Dates)
#Make sure the dates are characters (as in the original dataset I'm, working with)
All$Dates$start=as.character(All$Dates$start)
All$Dates$end=as.character(All$Dates$end)
我看过使用聚合:
aggregate(All$Data,by=list(All$Dates), FUN = "mean")
但我得到了错误:
Error in aggregate.data.frame(as.data.frame(x), ...) :
arguments must have same length
我尝试使用 group_by:
group_by(All$Dates)
但是返回了这个错误:
Error in UseMethod("group_by_") :
no applicable method for 'group_by_' applied to an object of class "list"
我可以使用哪些函数按天对数据进行分组,并表示 R 中列表中新创建的组?
编辑:
我需要生成的输出大小为 365 x 189 x 420,其中 1:365 是一年中的几天,189 x 420 是 latitude/longitude.
所以,我想将 All$Dates 属性中的所有 1 月 1 日用于 index/group 大小为 189 x 420 的关联 (All$Data) 网格(其中将有四个是四年的数据)然后求这四个的平均值grids/arrays。因此,在这个例子中,四个一月的第一,将被平均生成一个大小为 189 x 420 的网格。这将在一年中的每一天执行,以生成最终的 365 x 189 x 420 数据集。这是否阐明了我正在尝试做的事情?
这并不快,但我认为它确实产生了所需的输出。
library(lubridate)
date <- glue::glue("{month(ymd(All$Dates$start))}-{mday(ymd(All$Dates$start))}")
undate <- unique(date)
out <- array(dim=c(length(undate), 189, 420))
for(i in 1:length(undate)){
w <- which(date == undate[i])
out[i,,] <- apply(All$Data[w,,, drop=FALSE], c(2,3), mean)
}
我想按日期(每天)对下面的数据进行分组,并获取每组的平均值。
下面创建的数据集是 3 维数组,其中 i= 时间(以天为单位),j= 纬度和 k= 经度。此数据集的长度为 4 年(1461 天),并具有属性 'Dates' 来表示每个 days/dates。我想表示 'Data' 中的数据,以便我最终得到 1 月 1 日、1 月 2 日等的一个平均值
#First create the example dataset
tmintest=array(1:100, c(420,189,1461))
#create the list
Variable <- list(varName="rr")
Data = tmintest
xyCoords <- list(x = seq(-40.37,64.37,length.out=420), y = seq(25.37,72.37,length.out=189))
Dates <- list(start = seq(as.Date("2012-01-01"), as.Date("2015-12-31"), by="days"), end=seq(as.Date("2012-01-01"), as.Date("2015-12-31"), by="days"))
All <- list(Variable = Variable,Data=aperm(Data), xyCoords=xyCoords,Dates=Dates)
#Make sure the dates are characters (as in the original dataset I'm, working with)
All$Dates$start=as.character(All$Dates$start)
All$Dates$end=as.character(All$Dates$end)
我看过使用聚合:
aggregate(All$Data,by=list(All$Dates), FUN = "mean")
但我得到了错误:
Error in aggregate.data.frame(as.data.frame(x), ...) :
arguments must have same length
我尝试使用 group_by:
group_by(All$Dates)
但是返回了这个错误:
Error in UseMethod("group_by_") :
no applicable method for 'group_by_' applied to an object of class "list"
我可以使用哪些函数按天对数据进行分组,并表示 R 中列表中新创建的组?
编辑: 我需要生成的输出大小为 365 x 189 x 420,其中 1:365 是一年中的几天,189 x 420 是 latitude/longitude.
所以,我想将 All$Dates 属性中的所有 1 月 1 日用于 index/group 大小为 189 x 420 的关联 (All$Data) 网格(其中将有四个是四年的数据)然后求这四个的平均值grids/arrays。因此,在这个例子中,四个一月的第一,将被平均生成一个大小为 189 x 420 的网格。这将在一年中的每一天执行,以生成最终的 365 x 189 x 420 数据集。这是否阐明了我正在尝试做的事情?
这并不快,但我认为它确实产生了所需的输出。
library(lubridate)
date <- glue::glue("{month(ymd(All$Dates$start))}-{mday(ymd(All$Dates$start))}")
undate <- unique(date)
out <- array(dim=c(length(undate), 189, 420))
for(i in 1:length(undate)){
w <- which(date == undate[i])
out[i,,] <- apply(All$Data[w,,, drop=FALSE], c(2,3), mean)
}