3

我正在尝试将函数应用于矩阵的每一行或每一列,但我需要为每一行传递不同的参数值。

我以为我熟悉 lapply、mapply 等……但可能还不够。

作为一个简单的例子:

> a<-matrix(1:100,ncol=10);
> a
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1   11   21   31   41   51   61   71   81    91
 [2,]    2   12   22   32   42   52   62   72   82    92
 [3,]    3   13   23   33   43   53   63   73   83    93
 [4,]    4   14   24   34   44   54   64   74   84    94
 [5,]    5   15   25   35   45   55   65   75   85    95
 [6,]    6   16   26   36   46   56   66   76   86    96
 [7,]    7   17   27   37   47   57   67   77   87    97
 [8,]    8   18   28   38   48   58   68   78   88    98
 [9,]    9   19   29   39   49   59   69   79   89    99
[10,]   10   20   30   40   50   60   70   80   90   100

假设我想对每一行应用一个函数,我会这样做:

apply(a, 1, myFunction);

但是我的函数需要一个参数,所以:

apply(a, 1, myFunction, myArgument);

但是,如果我希望我的论点对每一行采用不同的值,我就找不到正确的方法来做到这一点。如果我定义一个具有多个值的“myArgument”,整个向量显然将被传递给“myFunction”的每个调用。

我认为我需要一种 apply 和 multivariate mapply 之间的混合。是否有意义 ?

实现我的目标的一种“肮脏”方法是按行(或列)拆分矩阵,在结果列表上使用 mapply 并将结果合并回矩阵:

do.call(rbind, Map(myFunction, split(a,row(a)), as.list(myArgument)));

我查看了扫描、聚合、所有 *apply 变体,但我找不到满足我需要的完美匹配。我错过了吗?

谢谢您的帮助。

4

3 回答 3

1

你可以用它sweep来做到这一点。

a <- matrix(rnorm(100),10)
rmeans <- rowMeans(a)
a_new <- sweep(a,1,rmeans,`-`)
rowMeans(a_new)
于 2014-11-07T16:11:56.797 回答
0

我不认为有任何很好的答案,但是您可以通过使用来简化您的解决方案mapply,它为您处理“rbind”部分,假设您的函数总是返回相同大小的向量(而且,Map实际上只是mapply):

a <- matrix(1:80,ncol=8)
myFun <- function(x, y) (x - mean(x)) * y
myArg <- 1:nrow(a)

t(mapply(myFun, split(a, row(a)), myArg))
于 2014-11-07T21:37:40.360 回答
0

我知道这个话题很老,但我遇到了同样的问题,我以这种方式解决了它:

# Original matrix
a <- matrix(runif(n=100), ncol=5)
# Different value for each row
v <- runif(n=nrow(a))
# Result matrix -> Add a column with the row number
o <- cbind(1:nrow(a), a)
fun <- function(x, v) {
  idx <- 2:length(x)
  i <- x[1]
  r <- x[idx] / v[i]
  return(r)
}
o <- t(apply(o, 1, fun, v=v)

通过在原始矩阵的左侧添加具有行号的列,可以从数据矩阵的第一列接收来自参数向量的所需值的索引。

于 2017-11-07T07:50:55.903 回答