我有两个数据框df.o
和df.m
,如下所示。我需要根据两个标准找出df.o
(维度表)中哪个观察对应df.m
(事实表)中的哪些观察结果:1)df.o$Var1==df.o$Var1
和df.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
我也尝试过使用ifelse
,which
和match
的各种组合进行试验,但似乎都没有。
我遇到的问题是我的替换是与数据不同的行数,而且#34;较长的对象长度不是较短对象长度的倍数&#34;。
答案 0 :(得分:2)
您正在寻找的是&#34; 重叠加入&#34;,您可以尝试使用data.table::foverlaps
功能来实现此目标。
这个想法很简单
df.m
添加其他列)运行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