Для цикла, идентифицирующего несуществующие NA в R - PullRequest
0 голосов
/ 25 октября 2018

У меня есть большой фрейм данных с именем z с 107310 строками и 8 столбцами.У него нет NA, поскольку он прошел через эту функцию: z<-z[complete.cases(z),], чтобы исключить все строки, содержащие NA.

Я создал следующий цикл for, чтобы удалить все строки, если значение определенного столбца выше, чем значение другого конкретного столбца.

Во-первых, я попробовал следующий код:

  for(row in 1:nrow(z)){
   i <- z[row, 1]
  j <- z[row, 2]
  ci<- z[row, 6]
  cj<- z[row, 7]
  year <- z[row, 8]
      if(cj>ci){
    z<-z[-row,]}
}

Цикл будет проходить, но остановится на некоторой строке, указывая на следующую ошибку:

«ошибка: пропущенное значение гдеTRUE / FALSE требуется "

Несмотря на то, что там, где нет NA, я адаптировал цикл, чтобы избежать ошибки, делая значения в выражении if всегда числовыми:

for(row in 1:nrow(z)){
  i <- z[row, 1]
  j <- z[row, 2]
  ci<- z[row, 6]
  cj<- z[row, 7]
  year <- z[row, 8]
  temp<-ci-cj
  temp<-ifelse(!is.na(temp),temp,0)
  if(temp<=0){
    z<-z[-row,]}
}

Однако циклвсе еще останавливается, прежде чем удаляет все строки, в которых cj> ci. Последними значениями, которые он генерирует для i и j, является NA, а для ci и cj - NA_real, даже если эти значения не являются NA в наборе данных.

Кто-нибудь знает, что происходит? Спасибо

1 Ответ

0 голосов
/ 25 октября 2018

Вы можете избежать циклов, используя двухэтапный процесс.Сначала используйте ifelse, чтобы выделить случаи, которые нежелательны, а затем используйте subset, чтобы удалить их следующим образом:

z$flag <- ifelse(z$col6 < z$col7, 1, 0)
new_z <- subset(z, flag == 0)

, при этом предполагается, что 6-й и 7-й столбцы названы 'col6' и 'col7.

...