【问题标题】:use replace_na conditionally有条件地使用 replace_na
【发布时间】:2017-07-14 06:07:09
【问题描述】:

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

【问题讨论】:

    标签: r missing-data tidyverse


    【解决方案1】:

    我们可以使用逻辑条件将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
    

    【讨论】:

    • 虚幻!!!像魔术一样工作!我为此头疼了好几个小时!!!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2018-07-16
    • 2012-07-20
    相关资源
    最近更新 更多