如何在R中合并之前创建ID(by)?

时间:2015-11-17 08:59:40

标签: r merge match data.table

我有两个数据框df.odf.m,如下所示。我需要根据两个标准找出df.o(维度表)中哪个观察对应df.m(事实表)中的哪些观察结果:1)df.o$Var1==df.o$Var1df.o$date1 < df.m$date2 < df.o$date3这样我在df.o$oID中获取df.m$oID的正确值(在df.m$CORRECToID中手动输入正确的值)。我需要ID才能在之后完成合并。

df.o <- data.frame(oID=1:4,
                  Var1=c("a","a","b","c"),
                  date3=c(2015,2011,2014,2015),
                  date1=c(2013,2009,2012,2013),
                  stringsAsFactors=FALSE)
df.m <- data.frame(mID=1:3,
                      Var1=c("a","a","b"),
                      date2=c(2014,2010,2013),
                      oID=NA,
                      CORRECToID=c(1,2,3),
                      points=c(5, 10,15),
                      stringsAsFactors=FALSE)

我尝试了类似下面代码的各种组合,但没有运气:

df.m$oID[df.m$date2 < df.o$date3 & df.m$date2 > df.o$date1 & df.o$Var1==df.m$Var1] <- df.o$oID

我也尝试过使用ifelsewhichmatch的各种组合进行试验,但似乎都没有。

我遇到的问题是我的替换是与数据不同的行数,而且#34;较长的对象长度不是较短对象长度的倍数&#34;。

1 个答案:

答案 0 :(得分:2)

您正在寻找的是&#34; 重叠加入&#34;,您可以尝试使用data.table::foverlaps功能来实现此目标。

这个想法很简单

  1. 创建要重叠的列(向df.m添加其他列)
  2. 这些栏目的关键
  3. 运行foverlaps并选择要返回的列

    library(data.table)
    setkey(setDT(df.m)[, date4 := date2], Var1, date2, date4)
    setkey(setDT(df.o), Var1, date1, date3)
    foverlaps(df.m, df.o)[, names(df.m), with = FALSE]
    #    mID Var1 date2 oID CORRECToID points date4
    # 1:   2    a  2010   2          2     10  2010
    # 2:   1    a  2014   1          1      5  2014
    # 3:   3    b  2013   3          3     15  2013