gpt4 book ai didi

r - R 中的函数比 apply(..., ..., range) 快

转载 作者:行者123 更新时间:2023-12-01 22:25:53 25 4
gpt4 key购买 nike

我在围绕 apply() 编写时遇到了问题,它运行起来非常慢。我的任务是在不使用 apply() 的情况下给出矩阵的行范围。我正在尽力而为,但我仍然需要帮助...

这是我到目前为止得到的:

row.range <- function(X){
Y <- matrix(0, nrow = nrow(X), ncol = 2)

for(i in nrow(X)){
Y[i, 1] <- min(X[i, ])
Y[i, 2] <- max(X[i, ])
}
return(Y)
print(Y)
}

其中 X 可以是任何数字矩阵。可悲的是,输出只有 0,除了最后一行我实际上得到了正确的最小值和最大值。为什么这只适用于最后一行?

为了测试我使用了:

M <- matrix(sample(1:6, size = 100 * 5, replace = TRUE), ncol = 5)
row.range(X)

非常感谢任何帮助:-)

最佳答案

使用较小的可重现示例

set.seed(123)
M <- matrix(sample(1:6, size = 10 * 5, replace = TRUE), ncol = 5)

您可以尝试已经完全优化的 matrixStats::rowRanges 函数

matrixStats::rowRanges(M)
# [,1] [,2]
# [1,] 1 6
# [2,] 3 6
# [3,] 3 5
# [4,] 3 6
# [5,] 1 6
# [6,] 1 6
# [7,] 2 5
# [8,] 1 6
# [9,] 2 4
# [10,] 1 6

或基础 R 向量化 max.col 函数

cbind(M[cbind(1:nrow(M), max.col(-M))],
M[cbind(1:nrow(M), max.col(M))])
# [,1] [,2]
# [1,] 1 6
# [2,] 3 6
# [3,] 3 5
# [4,] 3 6
# [5,] 1 6
# [6,] 1 6
# [7,] 2 5
# [8,] 1 6
# [9,] 2 4
# [10,] 1 6

另一种半矢量化基础 R 方法是使用 pmin/pmax 结合 do.call(也提供可能的 NA 处理) ,但这需要将您的矩阵转换为 data.frame(不推荐)

DF <- as.data.frame(M)
cbind(do.call(pmin.int, c(na.rm = TRUE, DF)),
do.call(pmax.int, c(na.rm = TRUE, DF)))
# [,1] [,2]
# [1,] 1 6
# [2,] 3 6
# [3,] 3 5
# [4,] 3 6
# [5,] 1 6
# [6,] 1 6
# [7,] 2 5
# [8,] 1 6
# [9,] 2 4
# [10,] 1 6

由于 R 是一种矢量化语言,按行操作通常会很慢,因此要么尝试矢量化,要么使用诸如 Rcpp 之类的包为了编写编译后的 C/C++ 循环(就像在第一种情况下所做的那样)

在大多数极端情况下,您仍然希望使用 compiler package 来极大地优化您的循环


关于您的 for 循环(正如@PereG 已经提到的那样),您有一个语法错误。而不是 for(i in nrow(X)) 这应该是 for(i in 1:nrow(X))。否则,您只会在最后一行进行操作。

关于r - R 中的函数比 apply(..., ..., range) 快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34610196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com