这是我的头(两个)
start end omreg
1 2011-01-19 2012-09-21 TRUE
2 2012-01-19 <NA> FALSE
3 2007-09-01 <NA> FALSE
4 2011-09-01 2012-01-11 FALSE
5 2008-09-01 <NA> FALSE
6 2013-09-01 2014-06-12 TRUE
如图所示,我有一个开始日期和结束日期。
这些数据适用于在特定日期和结束日期开始课程的学生在完成课程后的时间。
每个学期持续160天。这意味着一个学期持续160天。 2个学期的320天等...
兴趣在于学生们在160,320或480天之后通过课程等等......
我想为每个学期创建专栏
其中: 传递=真 失败=错误
接收我在160天内表现出色的学生:
gdk<-(difftime(as.Date(both$end), as.Date(both$start),
units="days") < 160 & !both$omreg)
但是接下来我很难找到准备好的学生
在160到320天之间。
即。 &lt; = 320但是> 160天。
也许在区间[160,320]天更容易说...
这可能有点凌乱解释,但我尽力解释我的问题。
我需要帮助的是如何更改上面的代码以便能够选择所需的范围。
答案 0 :(得分:0)
我试图理解你的问题,但我不确定我是否完全理解它。您基本上确实存在0到160,160和320之间的值的问题,依此类推。
我尝试用modulo
和both$end
both$start
操作的结果
因此,您将拥有下一个较低的天数,并可以对此值执行进一步操作。
一步一步
假设您的数据是
start <- (c("2011-01-19","2012-01-19","2007-09-01","2011-09-01","2008-09-01","2013-09-01"))
end <- (c("2012-09-21",NA,NA,"2012-01-11",NA,"2014-06-12"))
omreg <- c("TRUE","FALSE","FALSE","FALSE","FALSE","TRUE")
both <- data.frame(start,end,omreg)
# calculate the time difference and convert it to an integer
both$x <- as.integer(difftime(as.Date(both$end),as.Date(both$start), units=("days")))
# calculate the modulo
both$y <- both$x%%160
# subtract the module from the time difference so you get a value like 160, 320,..
both$diff <- both$x - both$y
#remove useless columns
both$x <- NULL
both$y <- NULL
所以你的结果会是这样的
start end omreg diff
1 2011-01-19 2012-09-21 TRUE 480
2 2012-01-19 <NA> FALSE NA
3 2007-09-01 <NA> FALSE NA
4 2011-09-01 2012-01-11 FALSE 0
5 2008-09-01 <NA> FALSE NA
6 2013-09-01 2014-06-12 TRUE 160