【问题标题】:R - Apply function with different argument value for each row/column of a matrixR - 为矩阵的每一行/列应用具有不同参数值的函数
【发布时间】:2015-01-04 11:26:05
【问题描述】:

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

我以为我熟悉 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)));

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

感谢您的帮助。

【问题讨论】:

    标签: r apply mapply


    【解决方案1】:

    您可以使用sweep 来执行此操作。

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

    【讨论】:

    • 看起来我尝试的时候并没有很清醒。你建议再看看它让我很开心。谢谢,对“幼稚”的问题感到抱歉。我希望这可以在以后对其他人有所帮助。
    • 经过进一步测试,我记得为什么扫描没有成功。实际上,与 'apply' 不同,函数 'sweep' 只会调用函数 FUN 一次,将原始矩阵和一个由参数 'STAT' 和 'MARGIN' 构建的值的矩阵传递给它。它假设函数 FUN 将对矩阵执行逐个单元格的操作。我想要实现的是为原始矩阵的每一行(或每一列)调用“myFunction”。为了清楚起见,一个合适的例子包括在每一行上应用一个不同大小的平滑窗口。
    【解决方案2】:

    我认为没有什么好的答案,但是您可以通过使用 mapply 在某种程度上简化您的解决方案,它会为您处理“rbind”部分,假设您的函数总是返回相同大小的向量(另外,@ 987654322@ 真的只是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))
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-12
        • 1970-01-01
        • 2019-07-24
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        相关资源
        最近更新 更多