我正在尝试将函数应用于矩阵的每一行或每列,但我需要为每一行传递不同的参数值。
我以为我熟悉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和多元mapply之间使用一种混合体。它有意义吗?
实现我的目标的一个'脏'方法是按行(或列)拆分矩阵,在结果列表上使用mapply并将结果合并回矩阵:
do.call(rbind, Map(myFunction, split(a,row(a)), as.list(myArgument)));
我看过扫描,聚合,所有*应用变化,但我找不到与我的需要完美匹配。我错过了吗?
感谢您的帮助。
答案 0 :(得分:1)
您可以使用sweep
来执行此操作。
a <- matrix(rnorm(100),10)
rmeans <- rowMeans(a)
a_new <- sweep(a,1,rmeans,`-`)
rowMeans(a_new)
答案 1 :(得分:0)
我认为没有什么好的答案,但你可以通过使用mapply
来处理&#34; rbind&#34;部分适合您,假设您的函数始终返回相同大小的向量(另外,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))
答案 2 :(得分: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)
通过在原始矩阵的左侧添加行号,可以从数据矩阵的第一列接收参数向量中所需值的索引。