data.table基于R中的组的外部联接
我有一个包含以下列的数据: 案例ID、时间、价值 “时间”列的值不是以1为固定间隔。我试图用'NA'为除CaseID之外的其余列添加缺失的时间值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
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]