Я не могу избавиться от АН независимо от того, что я пытаюсь - пропущено значение, где требуется ИСТИНА / ЛОЖЬ - PullRequest
0 голосов
/ 24 января 2020

Я пытался оптимизировать свой l oop, но я столкнулся с проблемой и не нашел здесь прямого решения. Я уже проверил другие потоки, такие как Ошибка в if / while (условие) {: отсутствует Значение, где ИСТИНА / ЛОЖЬ требуется , но это не помогает мне решить мою проблему. У меня все еще остается та же проблема.

Это мой код:

output <- character (nrow(df)) # predefine the length and type of the vector
condition <- (df$price < df$high & df$price > df$low)   # condition check outside the loop

system.time({
    for (i in 1:nrow(df)) {
        if (condition[i]) {
            output[i] <- "1"
         }else if (!condition[i]){
           output[i] <- "0"
        }else  {
            output[i] <- NA
        }
    }
    df$output <- output
})


Я в основном проверяю, находится ли моя цена в определенном диапазоне. Если он находится внутри диапазона, я присваиваю ему 1, а если он выходит за пределы диапазона, я присваиваю ему 0. Однако у меня есть пара значений NA, и тогда мой l oop останавливается в тот момент, когда я достигаю NA.

Ниже вы можете увидеть рабочий код, если я отфильтрую NA. Но я хотел бы иметь способ, который бы также обрабатывал NA.

df<- df%>% filter(!is.na(price))
output <- character (nrow(df)) # predefine the length and type of the vector
condition <- (df$price < df$high & df$price > df$low)   # condition check outside the loop


system.time({
  for (i in 1:nrow(df)) {
    if (condition[i]) {
      output[i] <- "1"
    }else  {
      output[i] <- "0"
    }
  }
  df$output <- output
})

Есть идеи, как я мог бы обращаться с NA?

Ответы [ 3 ]

2 голосов
/ 24 января 2020

Если / еще в R не нравятся NA. Вы можете попробовать это, где вы начнете с проверки состояния NA на входе, а затем проверьте TRUE или FALSE вашего состояния.

output <- character (nrow(df)) # predefine the length and type of the vector
condition <- (df$price < df$high & df$price > df$low)   # condition check outside the loop

system.time({
    for (i in 1:nrow(df)) {

        if(is.na(condition[i])){
          output[i] <- NA
        }else (condition[i]) {
            output[i] <- "1"
         }else{
           output[i] <- "0"
        }
    }
    df$output <- output
})
2 голосов
/ 24 января 2020

Я думаю, что вы можете сделать:

df$output <- as.integer(df$price < df$high & df$price > df$low)

, который бы обрабатывал все случаи.

Например,

df <- data.frame(price = c(10, 23, NA, 50), high = 25, low = 5)
df$output <- as.integer(df$price < df$high & df$price > df$low)

df
#  price high low output
#1    10   25   5      1
#2    23   25   5      1
#3    NA   25   5     NA
#4    50   25   5      0
0 голосов
/ 24 января 2020

Мы также можем сделать

df$output <- +(df$price < df$high & df$price > df$low)
...