2017-07-14 1 views
3

Je souhaite remplacer de manière conditionnelle les revenus manquants jusqu'au 16 juillet 2017 par zéro en utilisant tidyverse.utilisation replace_na conditionnellement

Mes données

library(tidyverse) 
library(lubridate) 

    df<- tribble(
       ~Date, ~Revenue, 
      "2017-07-01",  500, 
      "2017-07-02",  501, 
      "2017-07-03",  502, 
      "2017-07-04",  503, 
      "2017-07-05",  504, 
      "2017-07-06",  505, 
      "2017-07-07",  506, 
      "2017-07-08",  507, 
      "2017-07-09",  508, 
      "2017-07-10",  509, 
      "2017-07-11",  510, 
      "2017-07-12",  NA, 
      "2017-07-13",  NA, 
      "2017-07-14",  NA, 
      "2017-07-15",  NA, 
      "2017-07-16",  NA, 
      "2017-07-17",  NA, 
      "2017-07-18",  NA, 
      "2017-07-19",  NA, 
      "2017-07-20",  NA 
     ) 

df$Date <- ymd(df$Date) 

date jusqu'à laquelle je veux remplacer conditionnellement NAs

max.date <- ymd("2017-07-16") 

sortie Je désire

# A tibble: 20 × 2 
      Date Revenue 
      <chr> <dbl> 
    1 2017-07-01  500 
    2 2017-07-02  501 
    3 2017-07-03  502 
    4 2017-07-04  503 
    5 2017-07-05  504 
    6 2017-07-06  505 
    7 2017-07-07  506 
    8 2017-07-08  507 
    9 2017-07-09  508 
    10 2017-07-10  509 
    11 2017-07-11  510 
    12 2017-07-12  0 
    13 2017-07-13  0 
    14 2017-07-14  0 
    15 2017-07-15  0 
    16 2017-07-16  0 
    17 2017-07-17  NA 
    18 2017-07-18  NA 
    19 2017-07-19  NA 
    20 2017-07-20  NA 

La seule façon que j'ai pu travailler sur ce point était de diviser la df en plusieurs parties, mettre à jour pour NAs puis rbind le lot entier.

Pourriez-vous m'aider s'il vous plaît à faire cela efficacement en utilisant tidyverse.

Répondre

6

Nous pouvons mutate la colonne « revenu » pour replace le NA avec 0 en utilisant une condition logique qui vérifie si l'élément est NA et la « Date » est inférieur ou égal à max.date '

df %>% 
    mutate(Revenue = replace(Revenue, is.na(Revenue) & Date <= max.date, 0)) 
# A tibble: 20 x 2 
#   Date Revenue 
#  <date> <dbl> 
# 1 2017-07-01  500 
# 2 2017-07-02  501 
# 3 2017-07-03  502 
# 4 2017-07-04  503 
# 5 2017-07-05  504 
# 6 2017-07-06  505 
# 7 2017-07-07  506 
# 8 2017-07-08  507 
# 9 2017-07-09  508 
#10 2017-07-10  509 
#11 2017-07-11  510 
#12 2017-07-12  0 
#13 2017-07-13  0 
#14 2017-07-14  0 
#15 2017-07-15  0 
#16 2017-07-16  0 
#17 2017-07-17  NA 
#18 2017-07-18  NA 
#19 2017-07-19  NA 
#20 2017-07-20  NA 

Il peut être réalisé avec data.table en spécifiant l'état logique « i et attribuer (:=) le 'revenu' à 0 ​​

library(data.table) 
setDT(df)[is.na(Revenue) & Date <= max.date, Revenue := 0] 

Ou avec base R

df$Revenue[is.na(df$Revenue) & df$Date <= max.date] <- 0 
+1

Unreal !!! fonctionne comme de la magie! Et je me suis cassé la tête pendant quelques heures !!! Merci beaucoup! – cephalopod