2016-06-14 4 views
2

Я новичок в R, и я работаю над функцией манипулирования набором данных.Обеспечение значений в матрице между заданным диапазоном?

У меня есть матрица значений 20 на 5, к которой я добавляю случайное число от -1 до 1. Как я могу обеспечить, чтобы все значения в матрице находились между 0-10 эффективным и быстрым способом (без использования цикла для проверки одного значения за раз).

Таковы правила:

  • Если значение больше 10, изменить его на 10
  • Если значение меньше thatn 0, изменить его на 0

Любой помощь приветствуется. Благодаря!

ответ

5

Что-то вроде

m[] <- pmax(0,pmin(10,m)) 

m[] на левой стороне (а не m) гарантирует, что матрица сохраняет свою структуру.

Вот (вероятно, нет необходимости) пример:

lwr <- 0; upr <- 10 
set.seed(101) 
mRaw <- matrix(runif(100, lwr, upr), nrow=20) 
m1 <- sample(c(-1,1),size=100,replace=TRUE) 
mAdded <- m1 + mRaw 

Теперь зажим:

mAdded[] <- pmax(lwr,pmin(upr,mAdded)) 
str(mAdded) 
## still a matrix: num [1:20, 1:5] 2.72 0 6.1 7.58 3.5 ... 
range(mAdded) ## 0 10 
+1

'матрица (образец (с (-1,1), размер = 100, заменить = TRUE), nrow = 20) 'может быть немного более простым –

+0

Спасибо @Ben Bolker. :-) Улучшенный код: 'library (dplyr)' 'mRaw <- runif (100, 0, 10)%>% as.integer%>% matrix (nrow = 20, ncol = 5)' 'm1 < - матрица (образец (c (-1,1), размер = 100, replace = TRUE), nrow = 20) ' ' mAdded <- m1 + mRaw' 'mAdded [] <- pmax (0, pmin (10 , mAdded)) ' –

+0

Я не против труб на их месте, но они, похоже, не приносят большой пользы здесь ... –

Смежные вопросы