有条件地使用replace_na

时间:2017-07-14 06:07:09

标签: r missing-data tidyverse

我希望有条件地使用tidyverse将截至2017年7月16日的缺失收入替换为零。

我的数据

$arr2[$i]

我想要有条件地替换NAs的日期

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)

我想要的输出

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

我能解决这个问题的唯一方法是将df分成几个部分,更新 # 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 然后NAs整个部分。

有人可以帮助我使用tidyverse有效地做到这一点。

1 个答案:

答案 0 :(得分:6)

我们可以mutate&#39;收入&#39;使用逻辑条件检查{@ 1}} replace列是否为NA,该逻辑条件检查该元素是否为NA以及&#39;日期&#39;小于或等于&#39; max.date&#39;

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

可以通过在{i}中指定逻辑条件并指定(data.table)&#39;收入&#39;来:=来实现。到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