合并用于合并的列中具有重复项的两个data.tables

时间:2018-10-12 10:39:40

标签: r merge duplicates data.table

我有一个关于合并两个data.tables的问题。到目前为止,我在stackoverflow或其他任何地方都找不到任何解决方案。因此,这里的问题是:

任务: 我想基于日期列(date_dawn)合并两个数据表。 如您所见,表A具有重复的日期,因为我从整天(ts.x)的多个时间戳记中获取日期。 表B每天有一个日期(date_dawn),有些列需要附加到表A。

我通过合并获得的错误消息为:

Error in vecseq(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__,  : 
Join results in 1469574 rows; more than 588399 = 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 by=.EACHI to run j 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 data.table issue tracker for advice.

示例表A

 date_dawn         ts.x                  ....
 1: 2015-09-22     2015-09-22 15:15:00
 2: 2015-09-22     2015-09-22 15:20:00
 3: 2015-09-23     2015-09-23 15:25:00
 4: 2015-09-23     2015-09-23 15:30:00
 5: 2015-09-23     2015-09-23 15:35:00
 6: 2015-09-24     2015-09-24 15:40:00

示例表B

  date_dawn       ts_ss                 ....
  1: 2015-09-22   2015-09-22 16:58:26
  2: 2015-09-23   2015-09-23 16:56:09
  3: 2015-09-24   2015-09-24 16:53:51
  4: 2015-09-25   2015-09-25 16:51:33
  5: 2015-09-26   2015-09-26 16:49:16
  6: 2015-09-27   2015-09-27 16:46:59

所需的输出将是:

   date_dawn         ts.x                  ts_ss                 ....
   1: 2015-09-22     2015-09-22 15:15:00    2015-09-22 16:58:26
   2: 2015-09-22     2015-09-22 15:20:00    2015-09-22 16:58:26
   3: 2015-09-23     2015-09-23 15:25:00    2015-09-23 16:56:09
   4: 2015-09-23     2015-09-23 15:30:00    2015-09-23 16:56:09
   5: 2015-09-23     2015-09-23 15:35:00    2015-09-23 16:56:09
   6: 2015-09-24     2015-09-24 15:40:00    2015-09-24 16:53:51

到目前为止,问题是任何其他“解决方案”(如上面的错误消息所假定的那样,在函数left_join中或在合并函数中使用allow.cartesian = T时)都使用了各种匹配x和y。但是我只希望将具有特定date_dawn的表B的行写入具有相应date_dawn的表A的行中。

感谢任何建议

解决方案:

问题是两个表中都有重复项。因此,我不得不基于多个列进行合并,或者确保其中一个表中没有重复项。这样,就可以合并,而无需在表A和B中的重复项之间获得所有可能的组合。 对不起,如果造成混乱,感谢社区的支持。

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解这个问题,您可以轻松地将两者合并,即:使用下面的dplyr

df1 <- data.frame(
    x = rep(c("x", "y"), 5),
    a = sample(1:5, 10, replace = T)
)

df2 <- data.frame(
    x = c("x", "y"),
    b = LETTERS[1:2]
)

library(dplyr)

left_join(df1, df2, by = "x")

编辑

根据您的评论,您可以只使用inner_join,就可以阅读所有?dplyr::join的文档。

library(dplyr)

# with duplicates
df1 <- data.frame(
  date_dawn = sample(
    seq.Date(Sys.Date() - 2, Sys.Date(), by  = "day"), 
    10, 
    replace = TRUE
  ),
  ts.x = seq.Date(Sys.Date() - 9, Sys.Date(), by  = "day")
)

df2 <- data.frame(
  date_dawn = seq.Date(Sys.Date() - 2, Sys.Date(), by  = "day"),
  ts_ss = seq.Date(Sys.Date() - 100, Sys.Date() - 98, by = "day")
)

# merge
inner_join(df1, df2, by = "date_dawn")
相关问题