9

私は単純な問題だと思っていましたが、適切な答えを見つけることができませんでした。多次元配列があり、グループ化変数 (グループ) を使用して、 zv[x,y,z]次元に沿って配列に関数を適用したいと考えています。以下に例を示します (R の場合):

v<-1:81
dim(v)<-c(3,3,9)
group<-c('a','a','a','b','b','b','c','c','c')

グループ化変数に 3 つのレベル ( abc )があるとすると、探している結果 ( out ) は次元 3x3x3 の配列になります。上記の例では、次のコードを使用して取得できます。

out1<-apply(v[,,c(1:3)],c(1,2),sum)
out2<-apply(v[,,c(4:6)],c(1,2),sum)
out3<-apply(v[,,c(7:9)],c(1,2),sum)

library(abind)
out<-abind(out1, out2, out3, along=3) 

私の質問は、大きな次元配列と長いグループ化ベクトルに適用できる、上記の結果を得る一般的な手段があるかどうかです。

4

3 に答える 3

7

簡単:

out <- apply(v, c(1, 2), by, group, sum)

ただし、必要な順序とまったく同じ順序でデータを取得するには、次のようにします。

out <- aperm(apply(v, c(1, 2), by, group, sum), c(2, 3, 1))
于 2013-04-21T21:55:17.047 に答える
5

パッケージ ラスターを使用する方が、ニーズに適している場合があります。リモートで感知されたデータを処理するために最適化されたコードがいくつかあり、チャンクでの処理を処理します。次の例を検討してください。

## Make 12 rasters, maybe one for each month of the year
for( i in seq(12) ){
    assign( paste0( "r" , i ) , raster( matrix(runif(1e3) , nrow = 1e2 ) ) )
}

## Create a raster stack from these
rS <- stack( mget( paste0("r",1:12) , envir = .GlobalEnv ) )

## Use calc to get mean, using by to group by a variable
## In this example I use the vector (1,1,1,2,2,2,3,3,3,4,4,4)
## meaning I get means for the first 3 rasters, then the next 3 etc
## So I get a mean for each quarter
rMean <- calc( rS , fun = function(x){ by(x , c( rep( 1:4 , each=3 ) ) , mean ) }  )

これは、4 つのレイヤー (四半期ごとに 1 つの平均) を持つラスター ブリックを返します。

class       : RasterBrick 
dimensions  : 100, 10, 1000, 4  (nrow, ncol, ncell, nlayers)
resolution  : 0.1, 0.01  (x, y)
extent      : 0, 1, 0, 1  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
data source : in memory
names       :         X1,         X2,         X3,         X4 
min values  : 0.02096586, 0.04015260, 0.04704145, 0.05884161 
max values  :  0.9727491,  0.9303025,  0.9804486,  0.9934670

これをあなたのデータに適応させていただければ幸いです。

于 2013-04-21T22:14:20.647 に答える
2

データがデータ フレームとしてフォーマットされている場合、これははるかに簡単です。

library(plyr)
vd <- adply(v, 1:3)
head(vd)

  X1 X2 X3 V1
1  1  1  1  1
2  2  1  1  2
3  3  1  1  3
4  1  2  1  4
5  2  2  1  5
6  3  2  1  6

次に、グループを添付するだけです...

vd$group <- rep(group, rep(3 * 3, length(group)))

...そして、次のグループに従って分割します。

daply(vd, .(group), function(df) { ... } )

匿名関数{ ... }は、グループごとに 1 回呼び出され、dfそのグループに対応するサブデータフレームが含まれます。ここでは、同様の機構を使用して、データを再結合してマトリックスに集約できます。関数は 3x3x1 の次元の配列を返す必要があります。これらは によって連結さdaplyれ、目的の結果が形成されます。

于 2013-04-21T21:11:40.510 に答える