如何最好地将函数应用于R中多维数组的边缘,而无需事先对维数进行硬编码。在二维数组中,我可以,例如:
myarray[1,] = f(myarray[1,])
myarray[M,] = f(myarray[M,])
myarray[,1] = f(myarray[,1])
myarray[,N] = f(myarray[,N])
但是如果我想要一个函数为任何维度的数组做这个怎么办?特别是,我如何以相对无痛的方式处理索引? (假设在角落处进行多次功能应用不是问题。)
如果我压扁阵列,我可以这样做,但我更喜欢矢量化方法。或者,我可以对每个维度的数组进行硬编码,直到某个维度并且在更高的情况下失败,但如果可能的话,我更喜欢更漂亮的东西。
答案 0 :(得分:1)
这是一个应该能够处理任意数量维度的解决方案。基本的想法是
apply()
apply()
返回每个维度的结果列表对于具有大尺寸和/或耗时选择的功能的阵列而言,这将非常耗时,因为该功能应用于可能大量未使用的值。但它应该允许任意函数和这些函数的任意结果。在这里:
## Set up array
xx<-array(1:24,dim=c(1,2,3,4))
## Determine number of dimensions in array
ndim<-length(dim(xx))
## Set up results vector (a list)
myAns<-vector("list",ndim)
## Iterating over the number of dimensions, apply a function
for(ii in seq_len(ndim)){
tempAns<-apply(xx,ii,function(x)list(mean(x)))
## Store first and last results in myAns vector
## If result is length 1, only store the single result
if(length(tempAns)==1){
myAns[[ii]]<-tempAns
} else {
myAns[[ii]]<-c(head(tempAns,1),tail(tempAns,1))
}
}
答案 1 :(得分:0)
你有没有这样的想法?
> ary <- array(1:27, c(3,3,3))
> apply(ary, MARGIN = 3, function(x) {
+ lastColMean <- mean(x[, ncol(x)])
+ lastRowMean <- mean(x[nrow(x), ])
+ data.frame(lastColMean, lastRowMean)
+ })
[[1]]
lastColMean lastRowMean
1 8 6
[[2]]
lastColMean lastRowMean
1 17 15
[[3]]
lastColMean lastRowMean
1 26 24