【问题标题】:calculate daily averages for 3d array计算 3d 数组的每日平均值
【发布时间】:2016-11-10 07:59:44
【问题描述】:

是否可以在 R 中对 3d 数组执行每日平均?

例如:

我有两天在纬度/经度网格上的 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.25 度分辨率的全球网格上,因此会变得非常大。
  • 好吧,那么您要么需要使用低效的循环,要么使用 Rcpp 编写一些东西。如果可以重塑,我会先尝试。

标签: r


【解决方案1】:

确定,在您的示例中,有 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)

查找与每一天对应的条目的indecies并将它们添加到新列中

# 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

【讨论】:

  • 示例中有两天。查看时间戳。你误解了这个问题。
  • 是的,我误解了,请检查编辑后的答案。我希望这次我明白了。
猜你喜欢
  • 1970-01-01
  • 2021-07-30
  • 2019-03-07
  • 1970-01-01
  • 2020-06-04
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
相关资源
最近更新 更多