Замена столбцов в R возвращает «индекс за пределами» - PullRequest
0 голосов
/ 07 мая 2018

Следующий бит кода должен поменять местами столбцы между уровнями массива, но это приведет к ошибке «индекс за пределами»:

pop <- array(1:25, dim = c(5, 10, 2)) # 2-level array with 5 rows and 10 columns
m <- 0.20 # proportion of columns to swap
K <- 2    

inds1 <- sample(ncol(pp), size = ceiling(ncol(x) * m), replace = FALSE) # sample random columns 
inds2 <- sample(ncol(pop), size = ceiling(ncol(x) * m), replace = FALSE)

    for (i in 1:K) { # swap columns between subarrays
      for(j in 1:K) {
        tmp <- pop[i,, inds1]
        pop[i,, inds1] <- pop[j,, inds2]
        pop[j,, inds2] <- tmp
    }
  }

Error in pop[i, , inds1] : subscript out of bounds

Мне интересно, почему R выдает ошибку здесь. Он также должен работать для любого массива n-уровня. Есть идеи, в чем проблема?

1 Ответ

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

Я думаю, проблема в том, что способ x определен, подмножества:

x[row, column, array level]

Вы пытаетесь получить доступ к столбцам в области уровня массива. Например, если у вас есть inds1 = 3, то pop[i, ,inds1] будет пытаться получить доступ к третьему массиву, который не существует. Смотрите ниже рабочий пример. Чтобы обратиться к вашему текущему примеру, нам нужно больше информации о pop и K:

x <- array(1:25, dim = c(5, 10, 2)) # 2-level array with 5 rows and 10 columns
m <- 0.20 # proportion of columns to swap    

set.seed(1)
inds1 <- sample(ncol(x), size = ceiling(ncol(x) * m), replace = FALSE) # sample random columns 
inds2 <- sample(ncol(x), size = ceiling(ncol(x) * m), replace = FALSE)

x
#, , 1
#
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,]    1    6   11   16   21    1    6   11   16    21
#[2,]    2    7   12   17   22    2    7   12   17    22
#[3,]    3    8   13   18   23    3    8   13   18    23
#[4,]    4    9   14   19   24    4    9   14   19    24
#[5,]    5   10   15   20   25    5   10   15   20    25
#
#, , 2
#
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,]    1    6   11   16   21    1    6   11   16    21
#[2,]    2    7   12   17   22    2    7   12   17    22
#[3,]    3    8   13   18   23    3    8   13   18    23
#[4,]    4    9   14   19   24    4    9   14   19    24
#[5,]    5   10   15   20   25    5   10   15   20    25

inds1;inds2
[1] 3 4
[1] 6 9

Таким образом, чтобы поменять местами столбцы 3 и 6 и столбцы 4 и 9, мы можем сделать:

temp <- x[, inds1, 1]
x[,inds1, 1] <- x[,inds2, 2]
x[,inds2, 2] <- temp
...