4

更新:澄清了问题和代码以回应评论者。

我不明白为什么date.ie创建一个 POSIXct 对象而是date.ipt创建一个数字对象。在这两种情况下,我都使用 lubridate 为日期添加天数。

set.seed(34859)
date.ie = (ymd("2013/07/01", tz="Africa/Nairobi")) + days(round(runif(10)*(150), 
                                         digits=0))

# creates this POSIXct object
# structure(c(1382821200, 1373922000, 1385326800, 1385154000, 1381093200, 
#             1381870800, 1372971600, 1377982800, 1382216400, 1383512400), class = c("POSIXct", 
#                                                                                    "POSIXt"), tzone = "Africa/Nairobi")

date.ie <- format(date.ie, format="%Y-%m-%d")

# creates this character object
# c("2013-10-27", "2013-07-16", "2013-11-25", "2013-11-23", "2013-10-07", 
#   "2013-10-16", "2013-07-05", "2013-09-01", "2013-10-20", "2013-11-04"
# )

date.ie2 <- ymd(date.ie)
treat <- rep(0:1, 5)
start.ipt <- (sample(x=c(0,1), size=10, replace=TRUE,                
                     prob=c(.5, .5))) # changed to even prob for small dataset

更新 2:

下一个块是我的旧方法,由于行为方式,它不起作用ifelse。谢谢@hadley 指出这一点。

date.ipt <- ifelse(treat==0 & start.ipt==1,
                   date.ie2 + days(round(runif(10)*(90), digits=0)),
                   ifelse(treat==1 & start.ipt==1,
                          date.ie2 + days(round(runif(100)*(60), digits=0)),NA))

# creates this numeric object
# c(1384992000, 1375488000, NA, NA, NA, 1385337600, 1375142400, 
# 1381449600, 1383782400, 1384560000)

date.ipt = format(data$date.ipt, format="%Y-%m-%d")

这是我的修复。我没有使用 ifelse 一步创建 date.ipt,而是分几步进行。我到达了我想去的地方,但这需要一段时间。希望评论者对如何更有效地做到这一点提出建议。

date.ipt.c <- date.ie2 + days(round(runif(10)*(90), digits=0))
date.ipt.c = format(date.ipt.c, format="%Y-%m-%d")

date.ipt.t <- date.ie2 + days(round(runif(10)*(60), digits=0))
date.ipt.t = format(date.ipt.t, format="%Y-%m-%d")

date.ipt <- ifelse(treat==1 & start.ipt==1, date.ipt.t, ifelse(treat==0 & start.ipt==1, date.ipt.c, NA))
date.ipt <- format(date.ipt, format="%Y-%m-%d")
date.ipt2 <- ymd(date.ipt)

days.to.ipt <- difftime(date.ipt2, date.ie2, tz="Africa/Nairobi", units="days")

data <- data.frame(date.ie, treat, start.ipt, date.ipt, days.to.ipt)
4

0 回答 0