data.table基于R中的组的外部联接

data.table基于R中的组的外部联接,r,data.table,R,Data.table,我有一个包含以下列的数据: 案例ID、时间、价值 “时间”列的值不是以1为固定间隔。我试图用'NA'为除CaseID之外的其余列添加缺失的时间值 Case Value Time 1 100 07:52:00 1 110 07:53:00 1 120 07:55:00 2 10 08:35:00 2 11 08:36:00 2 12 08:38:00 期望输出: Case Value Time 1 100

我有一个包含以下列的数据:

案例ID、时间、价值

“时间”列的值不是以1为固定间隔。我试图用'NA'为除CaseID之外的其余列添加缺失的时间值

Case Value  Time
1    100    07:52:00
1    110    07:53:00
1    120    07:55:00
2    10     08:35:00
2    11     08:36:00
2    12     08:38:00
期望输出:

Case Value  Time
1    100    07:52:00
1    110    07:53:00
1    NA     07:54:00
1    120    07:55:00
2    10     08:35:00
2    11     08:36:00
2    NA     08:37:00
2    12     08:38:00
我尝试了
dt[CJ(unique(CaseID),seq(min(Time),max(Time),“min”)]
但它给出了以下错误:

Error in vecseq(f__, len__, if (allow.cartesian || notjoin) NULL else as.integer(max(nrow(x),  : 
  Join results in 9827315 rows; more than 9620640 = max(nrow(x),nrow(i)). Check for duplicate key values in i, each of which join to the same group in x over and over again. If that's ok, try including `j` and dropping `by` (by-without-by) so that j runs for each group to avoid the large allocation. If you are sure you wish to proceed, rerun with allow.cartesian=TRUE. Otherwise, please search for this error message in the FAQ, Wiki, Stack Overflow and datatable-help for advice.
我无法让它工作..任何帮助都将不胜感激。

像这样

dt[,Time:=as.POSIXct(Time,format="%H:%M:%S")]
result <- dt[,list(Time=seq(min(Time),max(Time),by="1 min")),by=Case]
setkey(result,Case,Time)
setkey(dt,Case,Time)
result <- dt[result][,Time:=format(Time,"%H:%M:%S")]
result
#    Case Value     Time
# 1:    1   100 07:52:00
# 2:    1   110 07:53:00
# 3:    1    NA 07:54:00
# 4:    1   120 07:55:00
# 5:    2    10 08:35:00
# 6:    2    11 08:36:00
# 7:    2    NA 08:37:00
# 8:    2    12 08:38:00

我们按案例分组,并使用
.SD
时间
上加入每个组(因此设置
时间
上的键)。从这里,您可以使用如上所示的
format()

您想要的输出是什么?@davidernburg我已经用我想要的输出和我得到的错误编辑了这个问题,您是如何分配案例值的?我不明白为什么第6行而不是第7行是
NA
。data.table版本是1.9.4这给出了相同的错误,但现在我想是一组。错误:连接1504行中的结果;大于1440=最大值(nrow(x),nrow(i))。检查i中是否存在重复的键值,每个键值都会一次又一次地加入x中的同一组。如果可以的话,试着包括
j
和删除
by
(不包括by),这样j会为每个组运行,以避免大的分配。如果确定要继续,请使用allow.cartesian=TRUE重新运行。否则,请在FAQ、Wiki、堆栈溢出和datatable帮助中搜索此错误消息以获取建议。数据集的总大小为1000100rows@UoU,您是否阅读了说明如何修复的错误消息?检查或发布其他解释。您是否检查过给定案例是否有多条记录同时出现?我阅读了消息,并使用allow.cartesian=TRUE.尝试了它。但它仍然给出相同的错误。很明显,它对您提供的示例有效,这似乎不具有代表性。因此,您需要提供一个具有代表性的示例,或者将完整的数据集上传到某个地方,并在您的问题中提供一个链接。
dt[, Time := as.POSIXct(Time, format = "%H:%M:%S")]
setkey(dt, Time)
dt[, .SD[J(seq(min(Time), max(Time), by='1 min'))], by=Case]