我正在处理的数据表示例:
id date dayStop stop
1 2017/01/27 20 Y
1 2017/03/27 0 N
1 2017/04/27 10 Y
1 2017/05/27 0 N
1 2017/06/27 0 Y
2 2017/01/27 20 Y
2 2017/03/27 0 N
2 2017/04/27 10 N
2 2017/05/27 0 N
2 2017/06/27 0 Y
2 2017/07/27 0 Y
3 2017/01/27 20 N
3 2017/03/27 0 Y
3 2017/04/27 10 Y
3 2017/05/27 0 Y
3 2017/06/27 0 Y
3 2017/06/28 0 Y
当最后两行为ids
"Y"
时,我想为每个"Y"
提取行:
library(data.table)
DT[, if(all(tail(stop,2)=="Y")) .(stop=stop) , id]
我得到了:
id date dayStop stop
2 2017/01/27 20 Y
2 2017/03/27 0 N
2 2017/04/27 10 N
2 2017/05/27 0 N
2 2017/06/27 0 Y
2 2017/07/27 0 Y
3 2017/01/27 20 N
3 2017/03/27 0 Y
3 2017/04/27 10 Y
3 2017/05/27 0 Y
3 2017/06/27 0 Y
3 2017/06/28 0 Y
最后,如果id
>我将获得dayStop
20或两个"Y"
之间我有20天以上的差异(在两行之间减去列date
的值)
但如果在最后两行中我没有dayStop
的值,也没有足够的天数(< 20),我需要检查两个"Y"
是否在另一个"Y"
之前如果是这种情况,那么我需要检查新"Y"
和最后"Y"
之间是否有20天的差异,依此类推。 (如果它是"N"
,则id
将不会被拍摄)
示例:
3 2017/06/27 0 Y
3 2017/06/28 0 Y
还不够,但是:
3 2017/05/27 0 Y
3 2017/06/27 0 Y
3 2017/06/28 0 Y
是好的,因为(2017/06/28) - (2017/05/27)> 20。
是否可以在数据表的j区域中放置这样的条件,或者while循环可以有效地工作?
要复制粘贴data.table:
id <- c(1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3)
date <- as.Date(c("2017/01/27","2017/03/27","2017/04/27",
"2017/05/27",
"2017/06/27",
"2017/01/27",
"2017/03/27",
"2017/04/27",
"2017/05/27",
"2017/06/27",
"2017/07/27",
"2017/01/27",
"2017/03/27",
"2017/04/27",
"2017/05/27",
"2017/06/27",
"2017/06/28"))
dayStop <- c(20,0,10,0,0,20,0,10,0,0,0,20,0,10,0,0,0)
stop <- c("Y","N","Y","N","Y",
"Y","N","N","N","Y","Y",
"N","Y","Y","Y","Y","Y")
df <- data.frame(id, date, dayStop, stop)
DT <- as.data.table(df)