2016-11-10 257 views
2

是否可以對R中的3d陣列執行日均平均值?計算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

重塑你的數據,並使用通常的拆分申請,結合功能。 – Roland

+0

我寧願不重塑數據,因爲實際上數據是在0.25度分辨率的全球網格上,因此會變得相當大。 –

+0

那麼,你要麼使用低效循環,要麼用Rcpp寫東西。如果可以重塑,我會先嚐試。 – Roland

回答

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) 

查找對應於每個天條目的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 
+0

這個例子中有兩天。看到時間戳。你誤解了這個問題。 – Roland

+0

是的,我誤解了它,請檢查編輯答案。我希望我這次得到它。 – OmaymaS