【问题标题】:data.table outer join based on groups in R基于 R 中的组的 data.table 外连接
【发布时间】:2014-12-18 20:25:40
【问题描述】:

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

CaseID、时间、价值。

“时间”列的值不是 1 的固定间隔。我正在尝试为除 CaseID 之外的其余列添加缺失的时间值和“NA”。

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.

我无法让它工作..任何帮助将不胜感激。

【问题讨论】:

  • 你想要的输出是什么?
  • @DavidArenburg 我已经用我想要的输出和我得到的错误编辑了这个问题
  • 你是如何分配案例值的?
  • 我不明白为什么第 6 行而不是第 7 行是NA
  • data.table 版本为 1.9.4

标签: r data.table


【解决方案1】:

像这样??

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

另一种方式:

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]

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

【讨论】:

  • 这给出了同样的错误,但现在我猜是 1 个单组。错误:连接结果为 1504 行;超过 1440 = max(nrow(x),nrow(i))。检查 i 中的重复键值,每个键值都一遍又一遍地加入 x 中的同一组。如果没问题,请尝试包含 j 并删除 by(by-without-by),以便 j 为每个组运行以避免大量分配。如果您确定要继续,请使用 allow.cartesian=TRUE 重新运行。否则,请在 FAQ、Wiki、Stack Overflow 和 datatable-help 中搜索此错误消息以获取建议。数据集总大小为 1000100 行
  • @UoU,您是否阅读了说明如何修复它的错误消息?查看thisthis 帖子以获得更多解释。
  • 您是否检查过给定案例的多个记录是否具有相同的时间?
  • 我阅读了该消息并尝试使用 allow.cartesian=TRUE..但仍然给出相同的错误
  • 嗯,显然它适用于您提供的样本,这似乎不具有代表性。所以你需要提供一个有代表性的样本,或者上传完整的数据集并在你的问题中提供一个链接。
猜你喜欢
  • 2012-11-09
  • 2013-08-21
  • 2011-10-28
  • 2013-01-21
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
相关资源
最近更新 更多