Условная замена значений в массиве - PullRequest
0 голосов
/ 10 мая 2018

Я хочу изменить массив, но с поэлементным условием. Это то, что я хочу сделать

vector <- runif(18, 0,1)
xx <- array(vector, dim=c(2,3,3))
for (i in 1:2) {
    for (j in 1:3) {
        xx[i,j,1] <- ifelse(xx[i,j,1]<0.5,1,xx[i,j,1])
        xx[i,j,2] <- ifelse(xx[i,j,2]<0.4,1.5,xx[i,j,2])
        xx[i,j,3] <- ifelse(xx[i,j,3]<0.2,2,xx[i,j,3])
    }
}

Есть ли более эффективный способ сделать это? Спасибо

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Существует два способа упростить этот двойной цикл.

Вариант 1:

vector <- runif(18, 0,1)
xx <- array(vector, dim=c(2,3,3))

xx[,,1][xx[,,1]<.5] = 1
xx[,,2][xx[,,2]<.4] = 1.5
xx[,,3][xx[,,3]<.2] = 2

Однако вам все равно нужно написать одну строку для каждого условия.

Второй способ - использовать lapply, но в этом случае вам нужно создать три вектора: индекс, порог, замещение

idx = 1:3
thr = c(.5, .4, .2)
sb = c(1, 1.5, 2)

lapply(idx, function(k){
  xx[,,k][ xx[,,k]< thr[x] ] <<- sb[k]
  })
0 голосов
/ 10 мая 2018

Не уверен, что вы подразумеваете под эффективным, но это позволяет избежать зацикливания:

vector <- runif(18, 0,1)
xx <- array(vector, dim=c(2,3,3))
xx
xx[,,1][xx[,,1]<.5] <- 1
xx[,,2][xx[,,2]<.4] <- 1.5
xx[,,3][xx[,,3]<.2] <- 2

Попробуйте онлайн!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...