将向量元素作为参数应用于矩阵的函数。

7
假设我想将一个函数应用于矩阵的每一行。该函数的参数之一需要一个向量。我希望将向量的第一个元素应用于第一行,第二个元素应用于第二行,以此类推。
例如:
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组合中的函数,而我只对对角线元素感兴趣。我也研究了函数,但我不确定如何在这种情况下应用它。
非常感谢任何帮助。
2个回答

6

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中,每一列都是列表中的一个元素,因此我们需要进行转置(这样每个就可以对应到向量中的每个元素)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接