Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Data.table_Data Analysis - Fatal编程技术网

R 在定义的时间段内识别特定于组的定时事件

R 在定义的时间段内识别特定于组的定时事件,r,data.table,data-analysis,R,Data.table,Data Analysis,我有一个记录分类事件的数据集,它有两个时间点t1和t2,其中t2是aways>=t1。事件分为z1、z2、z3或NA(未分类)。对于每个组(grp),我想确定t1在组中任何分类t2事件的指定时间内的事件。在我的示例中,我将这些t2事件称为参考日期。循环过程显示了我所需要的内容,但在大型数据集上效率极低。我需要在包含数百万行和超过一百万个组的数据集上运行此命令 我还展示了如何使用data.table语法更有效地编写代码。我的方法是将每组的参考日期集分配给向量“ref”,然后对组中的每一行计算t1和

我有一个记录分类事件的数据集,它有两个时间点t1和t2,其中t2是aways>=t1。事件分为z1、z2、z3或NA(未分类)。对于每个组(grp),我想确定t1在组中任何分类t2事件的指定时间内的事件。在我的示例中,我将这些t2事件称为参考日期。循环过程显示了我所需要的内容,但在大型数据集上效率极低。我需要在包含数百万行和超过一百万个组的数据集上运行此命令

我还展示了如何使用data.table语法更有效地编写代码。我的方法是将每组的参考日期集分配给向量“ref”,然后对组中的每一行计算t1和参考日期之间的差值,并根据指定的间隔测试这些间隔,然后返回一个布尔值,指示特定于行的t1是否在任何引用日期的30天内。当我将每个组限制为一个参考日期(通过采用第一个日期[1])时,代码会起作用,但当我根据需要允许多个参考日期时,代码会返回错误。显然,我不理解数据表在j语句中的作用。有人能解释一下我的错误并提出一个有效的data.table解决方案吗

示例数据
库(“data.table”)
DT使用最新版本(1.9.8+):

DT[,`:=`(t1=as.Date(t1),t2=as.Date(t2),newvar=FALSE)]
DT[DT[!is.na(zcat),(grp,t2,t2.end=t2+31)],
on=(grp,t1>=t2,t1
我理解第1行,但第2行很粗略。您是否正在运行DT和DT子集之间的联接,其中包含引用日期,t2+31作为定义我的时间间隔的t2.end变量。并且,如果存在匹配项,此联接将newvar重置为TRUE。另外,当我运行第2行时,我收到一条消息…找不到函数“。我正在Mac/OSX 10.11.6上运行R3.2.2 GUI 1.66 Mavericks build(6996)。不确定这与您正在使用v1.9.7+的说明有何关系,您似乎理解了这一点。你必须有
数据。table
版本1.9.7+-否则它将不起作用。好的,现在使用github版本,需要在我的真实数据上运行它来检查所有ok和speed,非常感谢
library("data.table")
DT <-read.table(text=
"grp,zcat,t1,t2
a,NA,2007-03-18,2007-03-28
a,z1,2007-08-04,2007-08-14
a,NA,2007-08-21,2007-08-23
a,NA,2007-11-21,2007-11-29
a,z1,2007-12-10,2007-12-13
a,z2,2008-02-16,2008-02-19
a,NA,2008-03-14,2008-03-21
a,NA,2008-05-27,2008-06-03
b,NA,2003-04-22,2003-04-27
b,z3,2003-05-11,2003-05-23
b,z1,2003-07-16,2003-08-02
c,z3,2011-01-18,2011-02-07
c,z3,2011-03-01,2011-03-13
c,NA,2011-03-30,2011-04-11
c,NA,2011-05-21,2011-05-28",
header=TRUE, sep=",", stringsAsFactors=FALSE, na.strings="NA", colClasses="character")
DT <-data.table(DT)
setorder(DT,grp,t1)
out<-c()
for(i in 1:nrow(DT)){
    ref <-DT[grp == grp[i] & !is.na(zcat),t2]
    temp <-as.Date(DT$t1[i]) - as.Date(ref)
    out[i] <-any(temp >=0 & temp <31)
    rm(ref,temp)
    # ref; delta; delta >=0 & delta <31
    if(i==nrow(DT)){DT[, newvar :=out]; rm(out)}
}
DT[,{ref=t2[!is.na(zcat)]; delta=as.Date(t1) - as.Date(ref)[1]; delta >0 & delta <30}, by=grp]

DT[,{ref=t2[!is.na(zcat)][1]; delta=as.Date(t1) - as.Date(ref); delta >0 & delta <30}, by=grp]

DT[,{ref=t2[!is.na(zcat)]; delta=as.Date(t1) - as.Date(ref); any(delta >0 & delta <30)}, by=grp]
DT[, `:=`(t1 = as.Date(t1), t2 = as.Date(t2), newvar = FALSE)]

DT[DT[!is.na(zcat), .(grp, t2, t2.end = t2 + 31)],
   on = .(grp, t1 >= t2, t1 < t2.end),
   newvar := TRUE]