对每个元素的评估使用apply不同的函数参数

时间:2014-04-07 08:23:12

标签: r apply

假设我有一个矩阵,垫子。

mat <- matrix(1:5, nrow = 10, ncol = 3, byrow = TRUE)

我有一些我想要应用的功能,在本例中是按列。

getRMSE <- function(true, est) {
    sqrt(mean((true - est)^2))
}

(这个函数只是最近的一个例子,但我至少有5次这个完全相同的难题。)

如果要在矩阵上应用函数,请使用apply。但是,如果你想在一个矩阵中应用一个函数,在apply中使用不同的'x'值?

在这种情况下,目标是apply将执行与此相同的操作:

getRMSE(mat[,1], 1)
getRMSE(mat[,2], 2)
getRMSE(mat[,3], 3)

但是当给出一个向量作为函数的补充参数时,我总是遇到问题。显然

apply(mat, 2, getRMSE, c(1,2,3))

不会起作用,因为它也会回收列中的数字。但是

apply(mat, 2, getRMSE, rep(c(1,2,3), 25)) 

也行不通,我认为至少有一个机会。

2 个答案:

答案 0 :(得分:3)

您可以使用mapply,其中x是您的矩阵列,y是常量。我没有费心将矩阵转换为智能方式的列表,所以我必须在函数内部使用unlist

mat <- matrix(1:5, nrow = 10, ncol = 3, byrow = TRUE)

mat.list <- apply(mat, MARGIN = 2, FUN = list)

mapply(FUN = function(x, y) {
  sqrt(mean((unlist(x) - y)^2))
}, x = mat.list, y = list(1, 2, 3))

[1] 2.449490 1.732051 1.414214

答案 1 :(得分:2)

在这种特殊情况下,只需滚动&#34; est&#34;值为与#34; true&#34;匹配的矩阵。值。然后你可以减去矩阵(R将自动分组)并使用apply()colMeans()

> true <- matrix(1:5, nrow = 10, ncol = 3, byrow = TRUE)
> est <- matrix(1:3,nrow=nrow(true),ncol=ncol(true),byrow=TRUE)
> sqrt(colMeans((true-est)^2))
[1] 2.449490 1.732051 1.414214
> 

在涉及列表的更一般情况下,mapply()可能会有所帮助。