R 在大型数据集上使用data.table-需要添加表示组项首次出现后#周数的列

R 在大型数据集上使用data.table-需要添加表示组项首次出现后#周数的列,r,data.table,R,Data.table,使用data.tables,我试图添加一个新列,该列保存自分组中的事件发生以来的周数。(注意:后面的“周”,而不是差值(因此,从1开始,而不是零)) 看到数据和我的期望可能会让这更容易看到 我有以下数据集: library(data.table) DT1 <-fread("OrderDate,EventDate,OrderID,EventTypeID,LocationID,EncounterID 1/12/2012 5:40,01/12/2012 05:40,100001,12344,

使用data.tables,我试图添加一个新列,该列保存自分组中的事件发生以来的周数。(注意:后面的“周”,而不是差值(因此,从1开始,而不是零))

看到数据和我的期望可能会让这更容易看到

我有以下数据集:

library(data.table) 
DT1 <-fread("OrderDate,EventDate,OrderID,EventTypeID,LocationID,EncounterID 
1/12/2012 5:40,01/12/2012 05:40,100001,12344,1,5998887
1/12/2012 5:41,01/12/2012 05:49,100001,12345,1,5998887
1/12/2012 5:42,01/12/2012 06:40,100001,12345,1,5998887
1/12/2012 5:45,01/12/2012 05:45,100002,12344,1,5998887
1/12/2012 5:45,01/12/2012 05:49,100002,12345,1,5998887
8/12/2013 5:25,01/12/2012 06:40,100002,12345,1,5998887
8/12/2013 5:46,01/12/2012 05:46,100003,12344,2,5998887
9/12/2013 5:46,01/12/2012 05:49,100003,12345,2,5998887
1/12/2013 7:40,01/12/2013 07:40,123001,12345,2,6008887
1/12/2013 7:40,01/12/2013 07:41,123001,12346,2,6008887
16/12/2013 7:40,01/12/2013 07:50,123001,12345,2,6008887
17/12/2013 7:40,01/12/2013 07:55,123001,12345,2,6008887")


DT$OrderDate <- as.POSIXct(DT$OrderDate, format="%d/%m/%Y %H:%M")
DT$EventDate <- as.POSIXct(DT$EventDate, format="%d/%m/%Y %H:%M")
库(data.table)

DT1我对日期格式没有太多的练习,但这似乎是可行的:

DT1[,OrderDate:=as.Date(OrderDate,"%d/%m/%Y")]
setkey(DT1,EncounterID,OrderDate)
DT1[,w:=as.numeric(1L+floor((OrderDate-OrderDate[1])/7)),by=EncounterID]
setkey
调用对data.table进行排序,使第一个日期为
OrderDate[1]
。如果该值始终等于
EventDate
,则可以改为

DT1[,OrderDate:=as.Date(OrderDate,"%d/%m/%Y")]
DT1[,EventDate:=as.Date(EventDate,"%d/%m/%Y")]
DT1[,w:=as.numeric(1L+floor((OrderDate-EventDate)/7)),by=EncounterID]
试试这个:

DT[, WeeksSinceFirstEnc := OrderDate - min(EventDate), by = EncounterID]
DT[, WeeksSinceFirstEnc := as.numeric(DT$WeeksSinceFirstEnc)%/%(60 * 60 * 24 * 7) + 1]
首先,我计算每一行的第一个EventDate与每一行的OrderDate之间的差值。结果保存在新列中,但以秒为单位

第二步是使用整数除法运算符(
%/%
)将秒转换为周,然后添加1

我使用了第二个代码块中的数据,我有54个,其中有2个,因为EventDate的年份是2013年,而不是2012年


更新:根据Jan的建议,我已更改答案以节省内存。

您所需的输出(DT2)与您的输入(DT1)无关。我在输出的最后一行看到“17/12”,而在输入上看到“1/12”…Hi Mucio:)你应该避免
数据。表$非常感谢Mucio。在greatThanks中,我使用了一个变体,因为我已经有了POSIXct格式的变量,“/”似乎抛出了一个错误,因为没有为日期对象定义“/”。
DT[, WeeksSinceFirstEnc := OrderDate - min(EventDate), by = EncounterID]
DT[, WeeksSinceFirstEnc := as.numeric(DT$WeeksSinceFirstEnc)%/%(60 * 60 * 24 * 7) + 1]