假设我想将一个函数应用于矩阵的每一行。函数的一个参数采用向量。我想将向量的第一个元素应用于第一行,将第二个元素应用于第二行,等等。
例如:
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的矩阵,该功能应用于每一行&amp; Var组合,而我只对对角线元素感兴趣。我也查看了mapply
函数,但我不确定如何在这种情况下应用它。
任何帮助都会非常感激。
答案 0 :(得分:5)
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
都将映射到向量中的每个元素)。
答案 1 :(得分: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