gpt4 book ai didi

r - R中单行矩阵内的多个替换

转载 作者:行者123 更新时间:2023-12-01 09:51:23 24 4
gpt4 key购买 nike

有没有办法在 R 中的一行中进行以下替换?如果可能的话,效率会更高/更低吗?

m <- matrix(rnorm(100), ncol=10)

threshold <- 0.5

# Is there a single-line way to do the following in R
m[m < threshold] <- 0
m[m >= threshold] <- 1

我想知道 ifelse() 函数是否可以容纳这个,在 if < threshold then 0, else 1 的意义上

最佳答案

由于您需要一个由 1 和 0 组成的向量,您可以反转条件,将逻辑值转换为整数,并创建一个与 m 维度相同的新矩阵。

matrix(as.integer(m >= threshold), nrow(m))

您也可以只更改矩阵的模式。通常改变模式会在两行中完成,但你可以用

在一行中完成
`mode<-`(m >= threshold, "integer")

此外,正如@nicola 指出的,快速而肮脏的方法是

(m >= threshold) + 0L

通过添加零整数,我们将整个矩阵强制为整数。

其他几个(感谢@Frank):

+(m >= threshold)
m[] <- m >= threshold

基本上,是的。所有这些都在一行中执行任务,我几乎可以保证它们都比 ifelse() 更快。​​

更大矩阵上的一些基准测试(替换方法被省略):

m <- matrix(rnorm(1e7), ncol=100)
threshold <- 0.5

library(microbenchmark)

microbenchmark(
matrix = matrix(as.integer(m >= threshold), nrow(m)),
mode = `mode<-`(m >= threshold, "integer"),
plus0 = (m >= threshold) + 0L,
unary = +(m >= threshold)
)

# Unit: milliseconds
# expr min lq mean median uq max neval
# matrix 295.9292 315.4463 351.9149 351.8144 379.9840 453.4915 100
# mode 163.2156 172.0180 208.9348 202.8014 232.4525 347.0616 100
# plus0 170.2059 177.6111 202.3536 192.3516 223.8284 294.8367 100
# unary 144.0128 150.2696 183.2914 173.4010 203.7955 382.2397 100

为了完整起见,这里是使用 times = 1 的替换方法的基准。

microbenchmark(
replacement = { m[] <- m >= threshold },
times = 1
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# replacement 499.4005 499.4005 499.4005 499.4005 499.4005 499.4005 1

关于r - R中单行矩阵内的多个替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37032957/

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