Генерация фиктивной переменной путем оценки нескольких условий с помощью цикла for-if - PullRequest
0 голосов
/ 02 марта 2020

Я новичок в R, и у меня возникли проблемы с генерацией фиктивной переменной путем оценки ряда условий.

Я пытаюсь создать фиктивную переменную 'GRDUMMY'. GRDUMMY должна принимать значение 1, если:

- SG_MA> SG_MA_Year_Avg & LIQ

В противном случае оно должно принимать значение 0.

Один сложный У меня проблема в том, что у меня отсутствуют значения как в SG_MA, так и в LIQ (хотя не в SG_MA_Year_Avg и LIQ_Year_Avg).

Чтобы сгенерировать фиктивную переменную и решить эти проблемы, я попробовал следующий код:

for(i in 1:nrow(Merge_GRDUMMY)){
  if(is.na(Merge_GRDUMMY$SG_MA[i])){
    Merge_GRDUMMY$GRDUMMY <- "NA"
    }else if(is.na(Merge_GRDUMMY$LIQ[i])){
      Merge_GRDUMMY$GRDUMMY <- "NA"
    }else if(Merge_GRDUMMY$SG_MA[i] > Merge_GRDUMMY$SG_MA_Year_Avg[i] & Merge_GRDUMMY$LIQ[i] < Merge_GRDUMMY$LIQ_Year_avg[i]){
      Merge_GRDUMMY$GRDUMMY <- 1
    }else{
      Merge_GRDUMMY$GRDUMMY <- 0}
}

Пример данных:

> dput(Merge_GRDUMMY[1:4, c(14, 16, 21, 22)])
structure(list(SG_MA = c(NA_real_, NA_real_, NA_real_, NA_real_
), LIQ = c(-0.166091210233936, -0.238975053258208, -0.0423391360788804, 
-0.0255328112422608), SG_MA_Year_Avg = c(NaN, NaN, NaN, NaN), 
    LIQ_Year_avg = c(-0.0460118085010656, -0.0460118085010656, 
    -0.0460118085010656, -0.0460118085010656)), row.names = c(NA, 
4L), class = "data.frame")

Моя проблема, похоже, вышеприведенный l oop выполняет все операторы и, таким образом, присваивает значение «0» всем наблюдениям, даже тем, которые имеют пропущенные значения. Любые советы о том, что я делаю не так?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Другой способ сделать это с dplyr:

suppressPackageStartupMessages( library(dplyr) )

set.seed(123)

dfr <- tibble(
        SG_MA = c(rnorm(10), NA),
        SG_MA_Year_Avg = rnorm(11),
        LIQ = c(NA, rnorm(10)),
        LIQ_Year_Avg = rnorm(11)
)
# dfr

dfr %>% mutate(indic = case_when(is.na(SG_MA) | is.na(LIQ) ~ NA_real_,
                                 SG_MA > SG_MA_Year_Avg & LIQ < LIQ_Year_Avg ~ 1,
                                 TRUE ~ 0
))
#> # A tibble: 11 x 5
#>      SG_MA SG_MA_Year_Avg    LIQ LIQ_Year_Avg indic
#>      <dbl>          <dbl>  <dbl>        <dbl> <dbl>
#>  1 -0.560           1.22  NA          -0.295     NA
#>  2 -0.230           0.360 -0.218       0.895      0
#>  3  1.56            0.401 -1.03        0.878      1
#>  4  0.0705          0.111 -0.729       0.822      0
#>  5  0.129          -0.556 -0.625       0.689      1
#>  6  1.72            1.79  -1.69        0.554      0
#>  7  0.461           0.498  0.838      -0.0619     0
#>  8 -1.27           -1.97   0.153      -0.306      0
#>  9 -0.687           0.701 -1.14       -0.380      0
#> 10 -0.446          -0.473  1.25       -0.695      0
#> 11 NA              -1.07   0.426      -0.208     NA
0 голосов
/ 02 марта 2020

Всегда быстрее и удобочитаемее использовать векторизованные функции в R. ifelse - это векторизованная версия if.

Поскольку вы не опубликовали минимальный воспроизводимый пример Я не смог проверить ответ, но это должно помочь вам:

Merge_GRDUMMY$GRDUMMY <- ifelse(is.na(Merge_GRDUMMY$SG_MA) | is.na(Merge_GRDUMMY$LIQ), NA,
                                ifelse(-Merge_GRDUMMY$SG_MA > Merge_GRDUMMY$SG_MA_Year_Avg & Merge_GRDUMMY$LIQ < Merge_GRDUMMY$LIQ_Year_Avg, 1, 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...