将函数应用于R中多维数组的边

时间:2012-03-21 04:24:25

标签: r multidimensional-array

如何最好地将函数应用于R中多维数组的边缘,而无需事先对维数进行硬编码。在二维数组中,我可以,例如:

myarray[1,] = f(myarray[1,])
myarray[M,] = f(myarray[M,])
myarray[,1] = f(myarray[,1])
myarray[,N] = f(myarray[,N])

但是如果我想要一个函数为任何维度的数组做这个怎么办?特别是,我如何以相对无痛的方式处理索引? (假设在角落处进行多次功能应用不是问题。)

如果我压扁阵列,我可以这样做,但我更喜欢矢量化方法。或者,我可以对每个维度的数组进行硬编码,直到某个维度并且在更高的情况下失败,但如果可能的话,我更喜欢更漂亮的东西。

2 个答案:

答案 0 :(得分:1)

这是一个应该能够处理任意数量维度的解决方案。基本的想法是

  1. 对于每个维度,使用选择功能
  2. 调用apply()
  3. 该功能的每个结果都会变成长度为一的列表
  4. 这应该使apply()返回每个维度的结果列表
  5. 每个维度的第一个和最后一个列表项都存储在结果向量
  6. 对于具有大尺寸和/或耗时选择的功能的阵列而言,这将非常耗时,因为该功能应用于可能大量未使用的值。但它应该允许任意函数和这些函数的任意结果。在这里:

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