Есть ли способ преобразовать все NA в определенном столбце фрейма данных, только если в R выполняются два отдельных условия - PullRequest
0 голосов
/ 06 мая 2020

любая помощь с этой проблемой R будет невероятно оценена !! Заранее приносим свои извинения за i) неправильный синтаксис / форматирование. ii) этот вопрос, вероятно, задавался другими способами, которые я не могу найти. iii) Мне очень трудно описать словами (или с помощью упрощенных выражений) то, что я пытаюсь достичь ...

В двух словах, преобразование NA в 0 действительно несложно, однако преобразование НК в конкретном столбце c фрейма данных при двух или более условиях «если» - это совсем другое дело.

Мой фрейм данных - это журнал того, сколько раз аналитики опаздывали со своим типом отчета в прошлом году ( все сделано):

LateReporters

   Analyst Name  Report Type     Secured-Late  Unsecured-Late
1  Nick          Unsecured       NA             NA
2  John          Unsecured       NA             3
3  Emily         Secured         4              NA
4  Karen         Secured         NA             NA
5  Leslie        Unsec&Sec       NA             4
6  Joanna        Unsec&Sec       2              NA
7  Scott         Unsec&Sec       NA             NA
8  Stuart        Unsec&Sec       1              3

Это то, чего я пытаюсь достичь:

LateReporters

   Analyst Name  Report Type     Secured-Late  Unsecured-Late
1  Nick          Unsecured       NA             0
2  John          Unsecured       NA             3
3  Emily         Secured         4              NA
4  Karen         Secured         0              NA
5  Leslie        Unsec&Sec       0              4
6  Joanna        Unsec&Sec       2              0
7  Scott         Unsec&Sec       0              0
8  Stuart        Unsec&Sec       1              3

Правила:

1) Если аналитик сообщает «Незащищенный» отчет Введите только ', тогда любые НП в столбце «Незащищенное-позднее» должны быть изменены на 0, поскольку они действительно никогда не опаздывали, а все НП в столбце «Защищено-поздно» должны оставаться как НП (поскольку они не сообщают это).

1) Если аналитик сообщает только «Защищенный» «Тип отчета», тогда любые НП в столбце «Защищено-поздно» должны быть изменены на 0, поскольку они действительно никогда не опаздывали - и любые НК в столбце "Незащищенные-поздно" должны остаются как NA (поскольку они не сообщают об этом).

3) Если аналитик сообщает "Unsec & Se c" 'Report Type', то любые NA в 'Unsecured-Late' и 'Secure- Столбец «Поздно» должен быть изменен на 0, так как они действительно никогда не опаздывали.

Код попытки (и многие многие другие):

LateReporters <- if (LateReporters$'Report Type' == "Unsecured" & LateReporters$'Unsecured-Late == is.na(LateReporters$Unsecured-Late)) { LateReporter$Unsecured-Late [which(is.na(LateReporters$Unsecured-Late))] <- 0
}

LateReporters <- if (LateReporters$'Report Type' == "Secured" & LateReporters$'Secured-Late == is.na(LateReporters$Secured-Late)) { LateReporter$Secured-Late [which(is.na(LateReporters$Secured-Late))] <- 0
}

LateReporters <- if (LateReporters$'Report Type' == "Unsec&Sec" & LateReporters$'Unsecured-Late == is.na(LateReporters$secured) | LateReporters$'Secured-Late == is.na(LateReporters$secured) ) { LateReporter$Unsecured-Late [which(is.na(LateReporters$Unsecured-Late))] & LateReporter$Secured-Late [which(is.na(LateReporters$Secured-Late))] <- 0
}

Любые предложения, в которых я ошибаюсь, будут будь отличным.

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

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

С dplyr::case_when

library(dplyr)
df %>% 
  mutate(`Secured-Late` = case_when(`Report Type` == "Secured" & is.na(`Secured-Late`) ~ 0,
                                    `Report Type` == "Unsec&Sec" & is.na(`Secured-Late`) ~ 0,
                                    TRUE ~ `Secured-Late`),
         `Unsecured-Late` = case_when(`Report Type` == "Unsecured" & is.na(`Unsecured-Late`) ~ 0,
                                      `Report Type` == "Unsec&Sec" & is.na(`Unsecured-Late`) ~ 0,
                                      TRUE ~ `Unsecured-Late`))
# A tibble: 8 x 5
     X1 Analyst_Name `Report Type` `Secured-Late` `Unsecured-Late`
  <dbl> <chr>        <chr>                  <dbl>            <dbl>
1     1 Nick         Unsecured                 NA                0
2     2 John         Unsecured                 NA                3
3     3 Emily        Secured                    4               NA
4     4 Karen        Secured                    0               NA
5     5 Leslie       Unsec&Sec                  0                4
6     6 Joanna       Unsec&Sec                  2                0
7     7 Scott        Unsec&Sec                  0                0
8     8 Stuart       Unsec&Sec                  1                3
0 голосов
/ 06 мая 2020

В базе R немного неуклюже выглядит:

LateReports <- within(LateReports, {
  Unsecured_Late[is.na(Unsecured_Late) & Report_Type == "Unsecured"] <- 0
  Secured_Late[ is.na(Secured_Late) & Report_Type == "Secured"] <- 0
  Unsecured_Late[is.na(Unsecured_Late) & Report_Type == "Unsec&Sec"] <- 0
  Secured_Late[ is.na(Secured_Late) & Report_Type == "Unsec&Sec"] <- 0  
})
LateReports
#   Analyst_Name Report_Type Secured_Late Unsecured_Late
# 1         Nick   Unsecured           NA              0
# 2         John   Unsecured           NA              3
# 3        Emily     Secured            4             NA
# 4        Karen     Secured            0             NA
# 5       Leslie   Unsec&Sec            0              4
# 6       Joanna   Unsec&Sec            2              0
# 7        Scott   Unsec&Sec            0              0
# 8       Stuart   Unsec&Sec            1              3
...