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有效地做到这一点.
我们可以mutate将"收入"列replace的NA与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)