【问题标题】:Selecting dates from two dataframes and creating a new dataframe in R [duplicate]从两个数据框中选择日期并在 R [重复] 中创建一个新数据框
【发布时间】:2025-12-29 16:45:16
【问题描述】:

我想选择最接近日期 A 的日期(在日期 B 中),然后使用这些匹配项创建一个新数据框。每个 ID 可以有多行(即多个日期组合)。我正在使用 dplyr 和 data.table 包

dataframe A

ID  DATE A
3   15/05/06
5   14/11/05
8   25/11/08
1   16/12/10
1   5/01/12
1   24/07/14

dataframe B

ID  DATE B
3   12/12/05
3   17/04/06
5   25/07/05
5   26/09/05
5   1/12/05
8   12/09/08
8   13/11/08
8   23/12/08
8   31/03/09
1   26/11/10
1   12/08/11
1   12/11/11
1   14/03/14
1   8/08/14

Resultant dataframe:
ID  DATE A  DATE B
3   15/05/06    17/04/06
5   14/11/05    1/12/05
8   25/11/08    13/11/08
1   16/12/10    26/11/10
1   5/01/12     12/11/11
1   24/07/14    8/08/14

【问题讨论】:

  • 我正在结束您的一个较早的问题,因为接受的答案完全符合只需稍作调整(dfb[dfa, on=.(ID, Date), roll="nearest", mult="first", nomatch=0L][, .SD, .SDcols=c("ID", "DATEA", "DATEB")] 一旦您的数据框转换为 data.tables 并且正确定义了日期。
  • @Cath 谢谢Cath。我首先使用了 David Arunberg 提供的这个答案 # Create range columns dfa[, c("Date_m_180", "Date_p_180") := .(Date - 180L, Date + 180L)] # Join away indx = Date_m_180, Date
  • 谢谢凯丝。我首先使用了@David Arunberg indx = Date_m_180, Date 180 天的那些。我正在尝试找出如何结合这两个代码。你有什么建议吗?
  • 错字@David Arenburg
  • 似乎没有办法同时使用 roll= 180 和 roll="nearest"

标签: r date merge dplyr data.table


【解决方案1】:

一个想法是在ID 上合并,减去爸爸并保持最小值,即

d1 <- transform(merge(df1, df2, by = 'ID'), 
                 diff1 = as.POSIXct(DATE_A, '%d/%m/%y') - as.POSIXct(DATE_B, '%d/%m/%y'))

do.call(rbind, by(d1, d1$ID, function(i) i[which.min(i$diff1), ] ))

给出,

  ID   DATE_A   DATE_B      diff1
3  3 15/05/06 17/04/06  -701 days
5  5 14/11/05 26/09/05 -4322 days
8  8 25/11/08 31/03/09 -1947 days

【讨论】:

  • 谢谢@Sotos。我收到一个错误,这可能是因为我的数据框非常大。
  • 错误是什么?
  • 错误在 vecseq(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__, : Join 结果为 27706 行;超过 13904 = nrow(x)+nrow(i ).检查 i 中的重复键值,每个键值都一遍又一遍地加入 x 中的同一组。如果没问题,请尝试 by=.EACHI 为每个组运行 j 以避免大分配。如果你确定你如果希望继续,请使用 allow.cartesian=TRUE 重新运行。否则,请在 FAQ、Wiki、Stack Overflow 和 datatable-help 中搜索此错误消息以获取建议。
  • @sar 您的错误消息来自data.table,您的问题中没有任何线索表明您正在使用这个包(顺便说一句,问题不是来自太大的数据框,它是重复值的问题)
  • 道歉@Cath 我会更新我的问题