2017-07-14 97 views
3

我希望有條件地使用tidyverse替換2017年7月16日之前的缺失收入。有條件地使用replace_na

我的數據

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) 

日期最多,我想有條件地取代的NA

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

輸出我的願望

# 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 

我可以解決這個問題的唯一方法就是將df分成幾個部分,更新爲NAs,然後rbind

有人可以幫助我做到這一點有效地使用tidyverse。

回答

6

我們可以使用,檢查該元素是否是NA和「日期」小於或等於「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 
邏輯條件 mutate的「收入」列 replace

它可以與data.table通過在指定的邏輯條件「i和分配(:=)的 '收入' 來實現0

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

或用base R

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

虛幻!像魔術一樣工作!而且我在這幾個小時裏把我的頭痛了!非常感謝! – cephalopod