是否可以在R?
中对3d数组执行每日平均例如:
我在lat / lon网格上有一个3d数据点数组,为期两天。
lat <- 50:51
lon <- 2:3
time <- as.POSIXct(c('2009-01-01 12:00','2009-01-01 15:00','2009-01-01 17:00','2009-01-02 12:00',
'2009-01-02 16:00'))
j <- array(c(1:6, 11:16, 21:26), c(2,2,5))
dim(j)
[1] 2 2 5
其中第一维指的是纬度,第二维指的是经度,第三维指的是时间(即每个纬度/经度到时间的数据)。
我如何计算这些值的每日平均值并返回每日平均3d数组?
返回数组的尺寸应为
暗淡(j)的 [1] 2 2 2
时间维度对应于:
new_time <- as.POSIXct(c('2009-01-01','2009-01-02))
这可能吗?
如果不考虑不同的日子,我可以用:
执行3d平均apply(j, c(1,2), mean)
但我不确定如何在选定日期内进行平均。
任何帮助将不胜感激。
答案 0 :(得分:0)
好的只是为了确保,在你的例子中,有5天,对吗?
如果您想选择某些日期,例如第1天,第3天和第5天,您可以按如下方式指定:
> apply(j[,,c(1,3,5)], c(1,2), mean)
[,1] [,2]
[1,] 13 6.333333
[2,] 14 7.333333
击> <击> 撞击>
修改强>
好的,这是一个解决方法:
library(purrr)
library(lubridate)
如果您对独特的日子感兴趣:
# get days
tx <- day(time)
> tx
[1] 1 1 1 2 2
获取独特的日子并计算它们:
# unique days
txu <- unique(tx)
# number of unique days
d <- length(unique(tx))
创建数据框以保存所有数据
# create a df with days
df <- data.frame(day=1:d)
查找与每天相对应的条目的差异,并将其添加到新列
中# add a column with entries corresponding to each days
df <- df %>%
mutate(days_entries=map(day, function(x) which(tx %in% txu[x]) ))
> df
day days_entries
1 1 1, 2, 3
2 2 4, 5
在新列中添加每天值的均值
df <- df %>%
mutate(day_mean=map(days_entries,
{function(x) apply(j[,,x], c(1,2), mean)}
)
)
将所有方法放在一个数组中:
> k <- array( c( sapply(df$day_mean, function(x) x)) , dim = c( 2 ,2 ,d ) )
> dim(k)
[1] 2 2 2
> k
, , 1
[,1] [,2]
[1,] 6.333333 9.666667
[2,] 7.333333 10.666667
, , 2
[,1] [,2]
[1,] 23 12
[2,] 24 13