有条件地使用 replace_na

use replace_na conditionally

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

我的数据

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 有效地做到这一点。

我们可以 mutate 'Revenue' 列到 replace NA 与 0 使用逻辑条件检查元素是否为 NA 和 'Date' 小于或等于 '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

可以用data.table通过在'i中指定逻辑条件并将'Revenue'分配(:=)到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