Установите элементы, которые меньше нуля в столбцах 1 и 3, в ноль в R - PullRequest
0 голосов
/ 10 февраля 2019

У меня 4 на 5 случайных матриц.Как я могу установить элементы, которые меньше нуля в столбцах 1 и 3 на ноль в R?Я пытался использовать функцию 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) 

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Мне действительно нравится использовать функции min и max для таких вещей.В этом случае мы хотим pmax в R.

r1[,c(1,3)] <- pmax(r1[,c(1,3)], 0)

Или немного более запутанный:

r1[,c(1,3)][r1[,c(1,3)]<0] <- 0

Benchmark

Ипросто чтобы ответить на вопрос, похоже, что более запутанный способ - самый быстрый, но 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
0 голосов
/ 10 февраля 2019

Вы были близки, код должен быть

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 вам необходимо указать столбцы 1 и 3 для аргумента x, а также аргумент list.Проблема с вашим кодом в том, что list аргумент get переработан, и вы получите неправильные результаты.

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

data

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
...