有条件地使用replace_na

cep*_*pod 4 r missing-data tidyverse

我希望有条件地使用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)
Run Code Online (Sandbox Code Playgroud)

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

max.date <- ymd("2017-07-16")
Run Code Online (Sandbox Code Playgroud)

输出我想要的

    # 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
Run Code Online (Sandbox Code Playgroud)

我能解决这个问题的唯一方法是将df拆分成几个部分,NAs然后更新rbind整个部分.

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

akr*_*run 7

我们可以mutate将"收入"列replaceNA与0使用,检查该元素是否是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
Run Code Online (Sandbox Code Playgroud)

可以data.table通过在'i中指定逻辑条件并将:='收入' 分配给(0)来实现

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

或者 base R

df$Revenue[is.na(df$Revenue) & df$Date <= max.date] <- 0
Run Code Online (Sandbox Code Playgroud)

  • 虚幻!!!就像魔术一样!我为此伤透了几个小时!非常感谢! (2认同)