【问题标题】:R: Apply function to matrix with elements of vector as argumentR:将函数应用于以向量元素作为参数的矩阵
【发布时间】:2017-09-24 09:58:19
【问题描述】:

假设我想对矩阵的每一行应用一个函数。该函数的参数之一采用向量。我想将向量的第一个元素应用到第一行,将第二个元素应用到第二行,等等。

例如:

set.seed(123)
df<-matrix(runif(100), ncol=10)

var2 <- c(1:10)

MYFUNC <- function(x, Var=NA){ 
  sum(x)/Var 
}

我试过了:

apply(df, 1, function(x) MYFUNC(x, Var=var2))

但这给了我一个 10x10 矩阵,该矩阵将函数应用于每一行 & Var 组合,而我只对对角线元素感兴趣。我还研究了mapply 函数,但我不确定在这种情况下如何应用它。

任何帮助将不胜感激。

【问题讨论】:

    标签: r matrix vector apply


    【解决方案1】:

    Mapply 绝对有可能。这应该有效:

    mapply(MYFUNC, x = as.data.frame(t(df)), Var = var2)
    
    #V1        V2        V3        V4        V5        V6        V7        V8        V9       V10 
    #5.0795111 2.8693537 1.8285747 1.3640238 0.8300597 0.6280441 0.7706310 0.6720132 0.5719003 0.4259674 
    

    我认为您遇到的问题是mapply 采用向量或列表。在 R 中,矩阵不是列表,但 data.frames 是。您需要做的就是转置矩阵并转换为data.frame,然后mapply 应该可以工作。 data.frame 中的每一列都是列表中的一个元素,这就是我们必须转置它的原因(这样每个 row 都将映射到向量中的每个元素)。

    【讨论】:

      【解决方案2】:

      由于有两个参数应该分别是矩阵/向量中对应的行和元素,我们可以遍历行序列,对数据进行子集化并应用函数

      sapply(seq_len(nrow(df)), function(i) MYFUNC(df[i,], Var = var2[i]))
      #[1] 5.0795111 2.8693537 1.8285747 1.3640238 0.8300597 0.6280441
      #[7] 0.7706310 0.6720132 0.5719003 0.4259674
      

      具体例子可以用rowSums向量化

      rowSums(df)/var2
      #[1] 5.0795111 2.8693537 1.8285747 1.3640238 0.8300597 0.6280441 
      #[7] 0.7706310 0.6720132 0.5719003 0.4259674
      

      【讨论】:

        猜你喜欢
        • 2015-04-23
        • 1970-01-01
        • 2022-12-12
        • 2017-11-07
        • 2019-04-08
        • 1970-01-01
        • 2020-04-10
        • 2020-11-14
        • 2015-12-20
        相关资源
        最近更新 更多