2016-11-10 24 views
2

Rの3dアレイで毎日の平均化を実行できますか?例えば3dアレイの1日平均を計算する

私は2日間緯度/経度グリッド上のデータポイントの3次元アレイを有します。最初の寸法は緯度を意味

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 

は、第二の経度を意味し、そして第三の時間を意味する(すなわち、データにおける時間を経て各緯度/経度)。

これらの値の1日の平均を計算し、1日の平均3次元配列を返します。

new_time <- as.POSIXct(c('2009-01-01','2009-01-02)) 

は次のとおり

リターンアレイ [1] 2 2 2

時間寸法はに対応する

DIM(j)の寸法を有するべきですこれは可能ですか?

別の日を考慮に入れなければ、私は三次元の平均化を行うことができます。

apply(j, c(1,2), mean) 

が、私は選択した日にわたって平均化を実行する方法についてわからないんです。

ご協力いただければ幸いです。

+0

あなたのデータを再形成し、通常の分割適用コンバイン機能を使用しています。 – Roland

+0

実際には、データが0.25度分解能のグローバルグリッド上にあるので、データを再構成したくないので、かなり大きくなります。 –

+0

さて、非効率なループを使うか、Rcppで何かを書く必要があります。私は、再形成が可能ならまず試してみる。 – Roland

答えて

0

あなたの例では、5日間が正しいことを確認するだけです。

特定の日を選択する場合は、次のようにグラム、第一、第三及び第五は、あなたがそれらを指定することができます。

> apply(j[,,c(1,3,5)], c(1,2), mean) 
    [,1]  [,2] 
[1,] 13 6.333333 
[2,] 14 7.333333 

EDIT

[OK]を、ここで周りの仕事:

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)} 
          ) 
       ) 

1つのアレイ内のすべての手段を置く:

> 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

例には2日間あります。タイムスタンプを参照してください。あなたはその質問を誤解しています。 – Roland

+0

うん、私はそれを誤解しました、編集された答えを確認してください。私は今度それを得たことを願っています。 – OmaymaS