Вы пытаетесь быть очень умным с циклом for
, но вы не понимаете, как итерация работает в R. Когда ваш цикл начинается с for (c in 1:ncol(y))
, как только эта строка запускается в первый раз, * Будет оцениваться 1003 *, будет сгенерирована и сохранена последовательность 1:ncol(y)
, и каждый раз в цикле c
будет принимать следующее значение.
Допустим, y
имеет 3 столбца. Как только цикл начнется, для c
будет установлено значение 1, затем 2, затем 3. Если, когда c = 1
вы в конечном итоге удаляете первый столбец, вы запускаете c <- c-1
, чтобы сделать c
0 , это не имеет значения , потому что R не добавит 1 к c
- вы не говорите это c = c+1
каждый раз, когда вы проходите цикл, вам говорят, что R c
является одним из в первый раз, затем 2
во второй раз. Таким образом, c
равен 2 во второй раз, и вы пропустили столбец «используется, чтобы быть вторым, теперь первым». И в следующий раз в цикле c
будет 3, а третьего столбца больше нет.
У вас также есть проблема с вложенностью. Если y[1, 1]
равно 0, то первый столбец удаляется, вы устанавливаете c
и r
в 0. Ваш внутренний цикл переходит к следующей итерации, и, как объяснено выше, c
примет следующее значение, 2. Но мы еще не завершили внешний цикл, поэтому r
по-прежнему равен 0, и y[0, 2]
будет вашим следующим тестом. Но, конечно, нет 0 индекса.
Лучший способ
R векторизовано. Итак, мы (все сразу) определим, какие столбцы имеют нули, а затем (все сразу) удалим их.
# detect columns with 0
col_has_0 = colSums(y == 0) >= 1
# remove them
y = y[, !col_has_0]