【问题标题】:Using apply with a different function argument for each element's evaluation将 apply 与不同的函数参数一起用于每个元素的评估
【发布时间】:2014-04-07 08:23:11
【问题描述】:

假设我有一个矩阵,mat。

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)) 

也不起作用,我认为至少有一个机会。

【问题讨论】:

    标签: r apply


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 这……真的很有趣。我什至不确定我是否理解那里发生了什么,但这对于我的课程和应用来说是相当的。它绝对不会让我的代码更干净,但也许这只是我要达到的最佳效果。
    • @Chib 查看mapply 中的示例。它将指定的函数应用于列表的相应元素。这些列表元素作为函数参数名称传递。换句话说,它采用xy 的第一个元素并应用该函数。它需要xy 的第二个元素并应用该函数。以此类推,直到时间或列表结束。
    【解决方案2】:

    在这种特定情况下,只需将“est”值滚动到与“true”值匹配的矩阵中。然后你可以减去矩阵(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() 可能会有所帮助。

    【讨论】:

    • 这是我大部分时间都在做的事情,但我觉得这让我的代码可读性降低。我的想法是,有一些“应用”系列功能的明显实现可以满足我的要求。 mapply() 听起来不对,但我想我可以再看看它。
    猜你喜欢
    • 2016-01-23
    • 1970-01-01
    • 2014-08-28
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2022-01-12
    • 2013-01-03
    相关资源
    最近更新 更多