Ошибка: неожиданное '}' в "}" при удалении столбца с 0 в R - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь удалить столбцы, в которых есть 0.

Пока у меня есть это, и, кажется, ничего не работает.

for (r in 1:nrow(y)) {
  for (c in 1:ncol(y)) {
    if (y[r, c] == 0) {
      then y[,c] <- NULL
      r <- r-1
      c <- c-1
    }
  } 
}

Я не уверен насчет последних двух строк - я подумал, что это может пропустить что-то, если оно будет удалено в определенной точке.

Спасибо, ребята

1 Ответ

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

Вы пытаетесь быть очень умным с циклом 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...