我使用lubridate
和dplyr
包来处理日期变量并分别创建一个新的日期变量.
library(lubridate) library(dplyr)
让df
我的数据帧.我有两个变量date1
和date2
.我想创建一个新变量date
,使其取值date1
.如果date1
缺少,date2
则取代值.
df <- data.frame(date1 = c("24/01/2016",NA,"22/07/2016"), date2 = c("31/01/2016","09/02/2017",NA), stringsAsFactors=FALSE)`
上面的命令给出:
date1 date2 1 24/01/2016 31/01/2016 209/02/2017 3 22/07/2016
我尝试了以下,我认为可以给我所需的结果.但是,新date
变量在数字中.
df %>% mutate_at(vars(date1,date2),dmy) %>% mutate(date=ifelse(is.na(date1),date2,date1)) date1 date2 date 1 2016-01-24 2016-01-31 16824 22017-02-09 17206 3 2016-07-22 17004
我想要:
date1 date2 date 1 2016-01-24 2016-01-31 2016-01-24 22017-02-09 2017-02-09 3 2016-07-22 2016-07-22
我该如何解决这个问题?
使用dplyr::if_else
而不是base::ifelse
,根据?if_else
,类型更安全,
与基础ifelse()相比,此函数更严格.它检查true和false是否为同一类型.这种严格性使输出类型更具可预测性,并使其更快.
df %>% mutate_at(vars(date1,date2),dmy) %>% mutate(date=if_else(is.na(date1),date2,date1)) # date1 date2 date #1 2016-01-24 2016-01-31 2016-01-24 #22017-02-09 2017-02-09 #3 2016-07-22 2016-07-22
另一种选择是使用coalesce
,date1
如果不是NA
从date2
以下值获取值,则取值:
df %>% mutate_at(vars(date1,date2),dmy) %>% mutate(date = coalesce(date1, date2)) # date1 date2 date #1 2016-01-24 2016-01-31 2016-01-24 #22017-02-09 2017-02-09 #3 2016-07-22 2016-07-22
如果你想保持你的原代码,只是包装as.Date
周围ifelse
,因为ifelse
剥下类的结果,只保留基本数据,即自1970-01-01天数:
df %>% mutate_at(vars(date1,date2),dmy) %>% mutate(date=as.Date(ifelse(is.na(date1),date2,date1), origin = "1970-01-01"))