使用数据表R在多行上查找具有最小模式的id并进一步检查

时间:2017-03-20 12:33:09

标签: r string dataframe data.table match

我正在处理的数据表示例:

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)

0 个答案:

没有答案