在 R 中将第 1 列和第 3 列中小于零的元素设置为零
Set the elements that are less than zero in columns 1 and 3 to zero in R
我有 4 x 5 随机矩阵。
如何在 R 中将第 1 列和第 3 列中小于零的元素设置为零?
我尝试使用 replace()
函数。
r <- rnorm(20, mean=2, sd=2)
r1 <- matrix(r, ncol=5, nrow=4, byrow=T)
replace(r1, r1[,c(1,3)] < 0, 0)
感谢您的帮助!
你很接近,代码应该是
r1[, c(1,3)] <- replace(r1[, c(1,3)], r1[, c(1,3)] < 0, 0)
# [,1] [,2] [,3] [,4] [,5]
#[1,] 0.2061709 2.369698 5.175691 -0.26075135 1.839496
#[2,] 2.2648406 3.415909 1.520604 5.96894787 1.722426
#[3,] 2.8353015 3.963506 1.214609 -0.07933795 5.564458
#[4,] 0.0000000 3.757209 2.071613 4.02565738 2.864530
在 replace
中,您需要为 x
参数以及 list
参数指定第 1 列和第 3 列。您的代码的问题是 list
参数被回收,您会得到错误的结果。
replace(r1,r1[,c(1,3)] <0, 0)
# [,1] [,2] [,3] [,4] [,5]
#[1,] 0.2061709 2.369698 5.175691 -0.26075135 1.839496
#[2,] 2.2648406 3.415909 1.520604 5.96894787 1.722426
#[3,] 2.8353015 3.963506 1.214609 -0.07933795 5.564458
#[4,] 0.0000000 3.757209 0.000000 4.02565738 0.000000
数据
set.seed(2)
(r1 <- matrix(rnorm(20, mean=2, sd=2), ncol=5, nrow=4, byrow=T))
# [,1] [,2] [,3] [,4] [,5]
#[1,] 0.2061709 2.369698 5.175691 -0.26075135 1.839496
#[2,] 2.2648406 3.415909 1.520604 5.96894787 1.722426
#[3,] 2.8353015 3.963506 1.214609 -0.07933795 5.564458
#[4,] -2.6221382 3.757209 2.071613 4.02565738 2.864530
我实际上喜欢使用 min 和 max 函数来做这样的事情。在这种情况下,我们希望 pmax
in R.
r1[,c(1,3)] <- pmax(r1[,c(1,3)], 0)
或者更复杂一点:
r1[,c(1,3)][r1[,c(1,3)]<0] <- 0
基准
为了回答这个问题,看起来更复杂的方法是最快的,但是 replace
也很快。
library(microbenchmark)
microbenchmark(
r1[,c(1,3)] <- replace(r1[, c(1,3)], r1[, c(1,3)] < 0, 0),
r1[,c(1,3)][r1[,c(1,3)]<0] <- 0,
r1[,c(1,3)] <- pmax(r1[,c(1,3)], 0)
)
Unit: microseconds
expr min lq mean median uq max neval
r1[, c(1, 3)] <- replace(r1[, c(1, 3)], r1[, c(1, 3)] < 0, 0) 3.601 3.9005 4.97602 4.201 4.5020 25.501 100
r1[, c(1, 3)][r1[, c(1, 3)] < 0] <- 0 3.200 3.3020 4.75701 3.601 3.9020 24.201 100
r1[, c(1, 3)] <- pmax(r1[, c(1, 3)], 0) 12.601 13.1010 17.42398 13.901 15.5015 49.601 100
我有 4 x 5 随机矩阵。
如何在 R 中将第 1 列和第 3 列中小于零的元素设置为零?
我尝试使用 replace()
函数。
r <- rnorm(20, mean=2, sd=2)
r1 <- matrix(r, ncol=5, nrow=4, byrow=T)
replace(r1, r1[,c(1,3)] < 0, 0)
感谢您的帮助!
你很接近,代码应该是
r1[, c(1,3)] <- replace(r1[, c(1,3)], r1[, c(1,3)] < 0, 0)
# [,1] [,2] [,3] [,4] [,5]
#[1,] 0.2061709 2.369698 5.175691 -0.26075135 1.839496
#[2,] 2.2648406 3.415909 1.520604 5.96894787 1.722426
#[3,] 2.8353015 3.963506 1.214609 -0.07933795 5.564458
#[4,] 0.0000000 3.757209 2.071613 4.02565738 2.864530
在 replace
中,您需要为 x
参数以及 list
参数指定第 1 列和第 3 列。您的代码的问题是 list
参数被回收,您会得到错误的结果。
replace(r1,r1[,c(1,3)] <0, 0)
# [,1] [,2] [,3] [,4] [,5]
#[1,] 0.2061709 2.369698 5.175691 -0.26075135 1.839496
#[2,] 2.2648406 3.415909 1.520604 5.96894787 1.722426
#[3,] 2.8353015 3.963506 1.214609 -0.07933795 5.564458
#[4,] 0.0000000 3.757209 0.000000 4.02565738 0.000000
数据
set.seed(2)
(r1 <- matrix(rnorm(20, mean=2, sd=2), ncol=5, nrow=4, byrow=T))
# [,1] [,2] [,3] [,4] [,5]
#[1,] 0.2061709 2.369698 5.175691 -0.26075135 1.839496
#[2,] 2.2648406 3.415909 1.520604 5.96894787 1.722426
#[3,] 2.8353015 3.963506 1.214609 -0.07933795 5.564458
#[4,] -2.6221382 3.757209 2.071613 4.02565738 2.864530
我实际上喜欢使用 min 和 max 函数来做这样的事情。在这种情况下,我们希望 pmax
in R.
r1[,c(1,3)] <- pmax(r1[,c(1,3)], 0)
或者更复杂一点:
r1[,c(1,3)][r1[,c(1,3)]<0] <- 0
基准
为了回答这个问题,看起来更复杂的方法是最快的,但是 replace
也很快。
library(microbenchmark)
microbenchmark(
r1[,c(1,3)] <- replace(r1[, c(1,3)], r1[, c(1,3)] < 0, 0),
r1[,c(1,3)][r1[,c(1,3)]<0] <- 0,
r1[,c(1,3)] <- pmax(r1[,c(1,3)], 0)
)
Unit: microseconds
expr min lq mean median uq max neval
r1[, c(1, 3)] <- replace(r1[, c(1, 3)], r1[, c(1, 3)] < 0, 0) 3.601 3.9005 4.97602 4.201 4.5020 25.501 100
r1[, c(1, 3)][r1[, c(1, 3)] < 0] <- 0 3.200 3.3020 4.75701 3.601 3.9020 24.201 100
r1[, c(1, 3)] <- pmax(r1[, c(1, 3)], 0) 12.601 13.1010 17.42398 13.901 15.5015 49.601 100