如何从两个数据框中的最近日期匹配?

Dav*_*d Z 11 r

假设我有两个数据框,例如:

set.seed(123)
df1<-data.frame(bmi=rnorm(20, 25, 5),
                date1=sample(seq.Date(as.Date("2014-01-01"),
                             as.Date("2014-02-28"),by="day"), 20))

df2<-data.frame(epi=1:5, 
                date2=as.Date(c("2014-1-8", "2014-1-15", "2014-1-28", 
                                "2014-2-05", "2014-2-24")))
Run Code Online (Sandbox Code Playgroud)

我的问题是如何匹配bmiepi其中DATE1最接近之前或在date2?像这样的结果:

  epi      date2   bmi      date1
1   1 2014-01-08 33.58 2014-01-08
2   2 2014-01-15 22.64 2014-01-15
3   3 2014-01-28 22.22 2014-01-26
4   4 2014-02-05 15.17 2014-02-01
5   5 2014-02-24 27.49 2014-02-15
Run Code Online (Sandbox Code Playgroud)

Aru*_*run 13

一种方法是使用包中的roll=Inf功能data.table,如下所示:

require(data.table)   ## >= 1.9.2
setDT(df1)            ## convert to data.table by reference
setDT(df2)            ## same

df1[, date := date1]  ## create a duplicate of 'date1'
setkey(df1, date1)    ## set the column to perform the join on
setkey(df2, date2)    ## same as above

ans = df1[df2, roll=Inf] ## perform rolling join

## change names and set column order as required, by reference
setnames(ans, c('date','date1'), c('date1','date2'))
setcolorder(ans, c('epi', 'date1', 'bmi', 'date2'))

> ans
#   epi      date1      bmi      date2
#1:   1 2014-01-08 33.57532 2014-01-08
#2:   2 2014-01-15 22.63604 2014-01-15
#3:   3 2014-01-26 22.22079 2014-01-28
#4:   4 2014-02-01 15.16691 2014-02-05
#5:   5 2014-02-15 27.48925 2014-02-24
Run Code Online (Sandbox Code Playgroud)


use*_*650 11

这里有一个基地R的方式

# get time differences
temp <- outer(df2$date2, df1$date1,  "-")

# remove where date1 are after date2
temp[temp < 0] <- NA

# find index of minimum
ind <- apply(temp, 1, function(i) which.min(i))

# output
df2 <- cbind(df2,  df1[ind,])
Run Code Online (Sandbox Code Playgroud)