Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何获得不重叠的日期?_R_Date - Fatal编程技术网

R 如何获得不重叠的日期?

R 如何获得不重叠的日期?,r,date,R,Date,我想知道如何将此代码矢量化 dates = list(as.Date(c("2000-02-08", "2000-02-11")), as.Date(c("2000-03-02", "2000-03-07")), as.Date(c("2000-03-02", "2000-03-07")), as.Date(c("2000-03-03", "2000-03-07")), as.Date(c("2000-03-16", "2000-03-30")),

我想知道如何将此代码矢量化

dates = list(as.Date(c("2000-02-08", "2000-02-11")),
     as.Date(c("2000-03-02", "2000-03-07")),
     as.Date(c("2000-03-02", "2000-03-07")),
     as.Date(c("2000-03-03", "2000-03-07")),
     as.Date(c("2000-03-16", "2000-03-30")),
     as.Date(c("2000-03-16")))

i = 2
while(i <= length(dates))
{
     if(dates[[i]][1] < dates[[i-1]][2])
     {
        dates[[i]] = NULL
        i = i-1
    }

  i = i+1
}

例如,如果Date2包含在Date1的范围内,那么我们将删除Date2。

取决于您查看的方向。在我的示例中,您可以查看以下数据行是否重叠(我只查看开始日期,但您可以扩展它)

dates=列表(截至日期(c)(“2000-02-08”、“2000-02-11”),
截至日期(c)(“2000-03-02”、“2000-03-07”),
截至日期(c)(“2000-03-02”、“2000-03-07”),
截至日期(c)(“2000-03-03”、“2000-03-07”),
截至日期(c)(“2000-03-16”、“2000-03-30”),
截至日期(c)(2000-03-16)

m与来自包
数据的
重叠
。表

dates = list(as.Date(c("2000-02-08", "2000-02-11")),
            as.Date(c("2000-03-02", "2000-03-07")),
            as.Date(c("2000-03-02", "2000-03-05")),
            as.Date(c("2000-03-09", "2000-03-15")),
            as.Date(c("2000-03-16", "2000-03-30")),
            as.Date(c("2000-03-16")))

dt<-as.data.table(do.call(rbind,dates))
setkey(dt)
# Get id of the ranges within others
tmp <- foverlaps(dt,dt,which=T,type="within")[,xid]
# summarize this
t<-table(tmp)

# Filter for ranges appearing only once, hence not included in another one.
res <- dt[ as.integer(names(t[t==1])) , ]
# not aboslutely necessary, but it's to retrieve date objects which were converted by the rbind call.
res[, `:=`( V1=as.Date(V1,origin="1970-01-01"), V2=as.Date(V2, origin="1970-01-01"))][]  
如果要排除任何交叉点,请在foverlaps调用中设置
type=“any”
,以获得此输出:

           V1         V2
1: 2000-02-08 2000-02-11
2: 2000-03-09 2000-03-15

您可以查看
data.table
包中的
foverlaps
。您的示例输出听起来错误,但这些日期确实相交(03介于,02和07之间)
dates = list(as.Date(c("2000-02-08", "2000-02-11")),
            as.Date(c("2000-03-02", "2000-03-07")),
            as.Date(c("2000-03-02", "2000-03-05")),
            as.Date(c("2000-03-09", "2000-03-15")),
            as.Date(c("2000-03-16", "2000-03-30")),
            as.Date(c("2000-03-16")))

dt<-as.data.table(do.call(rbind,dates))
setkey(dt)
# Get id of the ranges within others
tmp <- foverlaps(dt,dt,which=T,type="within")[,xid]
# summarize this
t<-table(tmp)

# Filter for ranges appearing only once, hence not included in another one.
res <- dt[ as.integer(names(t[t==1])) , ]
# not aboslutely necessary, but it's to retrieve date objects which were converted by the rbind call.
res[, `:=`( V1=as.Date(V1,origin="1970-01-01"), V2=as.Date(V2, origin="1970-01-01"))][]  
           V1         V2
1: 2000-02-08 2000-02-11
2: 2000-03-02 2000-03-07
3: 2000-03-09 2000-03-15
4: 2000-03-16 2000-03-30
           V1         V2
1: 2000-02-08 2000-02-11
2: 2000-03-09 2000-03-15