有没有办法在 R 的一行中进行以下替换?如果可能,效率会更高/更低吗?m <- matrix(rnorm(100), ncol=10)threshold <- 0.5# Is there a single-line way to do the following in Rm[m < threshold] <- 0m[m >= threshold] <- 1我想知道 ifelse() 函数是否可以适应这一点,在 if 最佳答案 由于您需要 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.5library(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/
10-12 23:27