【问题标题】:Changing code based on the apply function to the lapply function将基于 apply 函数的代码更改为 lapply 函数
【发布时间】:2014-02-04 03:29:16
【问题描述】:

我正在尝试使用lapply 函数(或者实际上是mclapply 函数)而不是apply 函数来制定下面的代码。我希望它返回一个矩阵或类似的而不是一个列表。 hi函数在我的实际代码中非常复杂,所以我只是举了一个非常基本的例子。

hi <- function(a, matrix) {
  hi <- a[1] / a[2] * t(matrix) %*% matrix
  return(hi)
}

a_1 <- t(matrix(1:4))
a_2 <- t(matrix(5:8))
choleski <- matrix(1:4)

result <- apply(rbind(a_1, a_2), 2, hi, matrix=choleski)

所以我的问题基本上是,如何使用lapply 而不是apply 重新编写上面的代码,即将lapply 函数应用于hi 函数而不是使用apply 过程。一个有效的解决方案会很棒。

谢谢。

【问题讨论】:

  • lapply 返回列表。也许您想使用 sapply 或 mc* 等价物?您是在问如何有效地将hi 应用于rbind(a_1, a_2) 的每一列?
  • 我在问,我如何重新表述问题,以便使用 mclapply/lapply 而不是 apply 过程,即将两个矩阵变成一个列表应用 lapply 函数,然后将它变成一个再次矩阵。如果应用/应用有类似的 mc 函数,那也很棒。谢谢。

标签: r apply


【解决方案1】:

如果您打算将hi 应用于rbind(a_1, a_2) 的每一列,那么您可以执行以下操作:

A <- rbind(a_1, a_2)
sapply(seq_len(ncol(A)), function(i) hi(A[, i], choleski))

或者,更简单地说(如果可以将rbind(a_1, a_2) 设为data.frame):

A <- as.data.frame(rbind(a_1, a_2))
sapply(A, function(x) hi(x, choleski))

后者之所以有效,是因为 data.frame 是一种列表(其中列是它的元素),并且sapply 将函数应用于列表元素。默认情况下,sapply 会尽可能简化其输出。

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2014-08-07
    • 2020-07-28
    • 2023-04-10
    • 2015-11-09
    • 1970-01-01
    相关资源
    最近更新 更多