R 将函数应用于具有分组变量的多维数组

R 将函数应用于具有分组变量的多维数组,r,R,我有一个我认为很简单的问题,但我还没有找到一个合适的答案。我有一个多维数组v[x,y,z],我想使用一个分组变量(group)沿z维向数组应用一个函数。下面是一个示例(在R中): v如果您的数据被格式化为数据帧,那么这就容易多了: 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

我有一个我认为很简单的问题,但我还没有找到一个合适的答案。我有一个多维数组
v[x,y,z]
,我想使用一个分组变量(group)沿z维向数组应用一个函数。下面是一个示例(在R中):


v如果您的数据被格式化为数据帧,那么这就容易多了:

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
匿名函数
{…}
将为每个组调用一次,其中
df
包含对应于该组的子数据帧。在这里,您可以使用类似的机制将数据重新组合并聚合到矩阵中。该函数应返回一个尺寸为3x3x1的数组,这些尺寸将由
daply
连接,以形成所需的结果。

简单:

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

out使用包光栅可能更适合您的需要。它有一些经过优化的代码,用于处理遥感数据,处理成块。考虑这个例子:

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

我希望您能根据您的数据进行调整。

感谢Krlmlr抽出时间。不幸的是,这并不能解决我的问题。我举的例子是一个使用小型“模型”的例子。我使用的阵列是非常大的遥感数据,阵列中的每个矩阵都可以表示一个1000 x 1000点的空间矩阵乘以天数(z维),这包括多年。我需要找到每个月1000 x 1000点空间矩阵中每个点的平均值。在随后的分析中,我还需要维护数据的数组结构。再次感谢您的时间。鉴于您在@krlmlr下面的回复,如果您能更准确地描述您正在处理的数据,那就更好了。这是令人沮丧的发展,回答说,实际上,你的数据是非常不同的,你所描述的,所以不会工作!由于您正在处理遥感数据,我认为您可以查看
光栅
软件包,以及针对此类数据进行优化的
堆栈
计算
函数。这是一个函数,请通过
查找它。非常感谢Flodel,我非常感谢您的帮助。非常感谢Simon,与光栅数据一起使用看起来很有趣。我将用我拥有的几个数据集来测试它@阿霍帕拉:测试进行得怎么样?这个解决方案对你有用吗?或者你需要它更高效/更快吗?嗨,西蒙,很抱歉回复有点慢,但正忙着提交手稿。我有时间尝试一下你的建议,效果很好。不过,这比弗洛德尔的建议慢了一点。我运行了一个系统。Flodel的系统和用户时间分别为14.476和19.086,矩阵为269 100x100。目前,我正在将卫星图像转换为HDF5或NetCDF,然后导入R进行进一步分析。感谢您的帮助。以上时间是以秒为单位的英特尔®内核™ i7-2600K CPU@3.40GHz×8处理器。
vd$group <- rep(group, rep(3 * 3, length(group)))
daply(vd, .(group), function(df) { ... } )
out <- apply(v, c(1, 2), by, group, sum)
out <- aperm(apply(v, c(1, 2), by, group, sum), c(2, 3, 1))
## 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 ) }  )
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