Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-为矩阵的每行/每列应用具有不同参数值的函数_R_Apply_Mapply - Fatal编程技术网

R-为矩阵的每行/每列应用具有不同参数值的函数

R-为矩阵的每行/每列应用具有不同参数值的函数,r,apply,mapply,R,Apply,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

我试图对矩阵的每一行或每一列应用一个函数,但我需要为每一行传递一个不同的参数值

我以为我熟悉拉普利,马普利等等。。。但可能还不够

举个简单的例子:

> 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, myArgument);
但是如果我想让我的参数为每一行取不同的值,我就找不到正确的方法。 如果我定义了一个具有多个值的“myArgument”,那么整个向量显然会传递给“myFunction”的每个调用

我想我需要一种应用和多元映射之间的混合。这有意义吗

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

do.call(rbind, Map(myFunction, split(a,row(a)), as.list(myArgument)));
我查看了扫描、聚合和所有的*应用变化,但我找不到最适合我需要的。我错过了吗


谢谢您的帮助。

您可以使用
sweep
来完成此操作

a <- matrix(rnorm(100),10)
rmeans <- rowMeans(a)
a_new <- sweep(a,1,rmeans,`-`)
rowMeans(a_new)

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


a我知道这个话题很老,但我也遇到了同样的问题,我就是这样解决的:

# 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)
原始矩阵
a看来我试的时候并不是很清醒。你建议我再看一眼,这使我很高兴。谢谢你,很抱歉这个“天真”的问题。我希望这可以帮助其他人以后。经过进一步的测试,我记得为什么斯威普没有成功。实际上,与“apply”不同,“sweep”函数只调用函数FUN一次,将原始矩阵和由参数“STAT”和“MARGIN”构建的值传递给它。它假设FUN函数将对矩阵执行逐单元操作。我想要实现的是为原始矩阵的每一行(或每一列)调用“myFunction”。需要明确的是,一个合适的示例包括在每行上应用不同大小的平滑窗口。
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))
# 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)