我有一个具有开始日期和结束日期的数据集。缺少某些结束日期。正如您在下面看到的,我尝试了三种不同的方法,但都没有奏效。
startDay <- as.Date(c("2015-01-01","2015-03-01","2016-07-15","2016-08-02"), "%Y-%m-%d")
endDay <- as.Date(c("2018-01-01",NA,"2018-03-05",NA), "%Y-%m-%d")
id <- 1:4
dt <- data.frame(id, startDay, endDay)
dt
str(dt)
dt$caseDay <- as.Date("2018-07-20", "%Y-%m-%d")
str(dt)
dt
Run Code Online (Sandbox Code Playgroud)
这将我的变量的类从日期更改为数字:
dt$EndDay1 <-
ifelse(is.na(dt$endDay), dt$caseDay, dt$endDay)
str(dt)
dt
Run Code Online (Sandbox Code Playgroud)
这会生成一条错误消息。
dt$EndDay2 <-as.Date(
ifelse(is.na(dt$endDay), dt$caseDay, dt$endDay), "%Y-%m-%d")
str(dt)
dt
Run Code Online (Sandbox Code Playgroud)
如果我对相关帖子的研究/理解是正确的,下面的第 3 版应该可以解决问题。但是,这将所有内容都转换为缺失值。
dt$EndDay3 <-as.Date(as.character(
ifelse(is.na(dt$endDay), dt$caseDay, dt$endDay)), "%Y-%m-%d")
str(dt)
dt
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题的任何建议?谢谢
这是另一个想法:
library(dplyr)
library(lubridate)
Run Code Online (Sandbox Code Playgroud)
我们将使用lubridate::ymd和dplyr::case_when(有关更多好东西,请参阅此lubridate 备忘单)。
您的数据:
dt <- tibble(
startDay = ymd(c("2015-01-01", "2015-03-01", "2016-07-15", "2016-08-02")),
endDay = ymd(c("2018-01-01", NA, "2018-03-05", NA))
)
Run Code Online (Sandbox Code Playgroud)
的caseDay:
caseDay <- ymd("2018-07-20")
Run Code Online (Sandbox Code Playgroud)
使用case_when:
dt <- dt %>%
mutate(endDay = case_when(is.na(endDay) ~ caseDay,
TRUE ~ endDay))
Run Code Online (Sandbox Code Playgroud)
(注意:TRUE如果没有标记任何案例,案例就像“默认”一样)
结果:
> dt
# A tibble: 4 x 2
startDay endDay
<date> <date>
1 2015-01-01 2018-01-01
2 2015-03-01 2018-07-20
3 2016-07-15 2018-03-05
4 2016-08-02 2018-07-20
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1599 次 |
| 最近记录: |