计算3d数组的每日平均值

时间:2016-11-10 07:59:45

标签: r

是否可以在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)

但我不确定如何在选定日期内进行平均。

任何帮助将不胜感激。

1 个答案:

答案 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