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