首页 文章

R:将函数应用于矩阵,其中向量元素作为参数

提问于
浏览
5

假设我想将一个函数应用于矩阵的每一行 . 函数的一个参数采用向量 . 我想将向量的第一个元素应用于第一行,将第二个元素应用于第二行,等等 .

例如:

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 函数,但我不确定如何在这种情况下应用它 .

任何帮助将非常感激 .

2 回答

  • 2

    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.frame 是 . 您需要做的就是转置矩阵并转换为 data.frame 然后 mapply 应该工作 . data.frame 中的每一列都是列表中的一个元素,这就是我们必须转置它的原因(这样每个 row 都将映射到向量中的每个元素) .

  • 5

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

    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
    

相关问题