假设我有一个矩阵,垫子。
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))
也行不通,我认为至少有一个机会。
答案 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()
可能会有所帮助。