与R中的条件合并

时间:2018-04-06 14:03:53

标签: r merge conditional

varA=c('2018-01-03', '2018-01-25','2018-01-15','2018-01-06')
varB=c('2018-01-02', '2018-01-05', '2018-01-13', '2018-01-21', '2018-01-26')
varC=c(201801,201802,201804,201809,201815)

df1=as.data.frame(varA)
df2=as.data.frame(cbind(varB,varC))

使用上面的代码获取数据帧:

        varA
1 2018-01-03
2 2018-01-25
3 2018-01-15
4 2018-01-06

        varB   varC
1 2018-01-02 201801
2 2018-01-05 201802
3 2018-01-13 201804
4 2018-01-21 201809
5 2018-01-26 201815

由此我想将df1和df2合并在一起,但是如果varA作为日期在varB的两个日期之间,则它将从最早的日期开始采用varC。我认为更容易展示我期望的结果:

       varA    varB         varC
1 2018-01-03  2018-01-02   201801
2 2018-01-25  2018-01-21   201809
3 2018-01-15  2018-01-13   201804
4 2018-01-06  2018-01-05   201802

希望这很清楚。我不确定如何获得所需的输出。

3 个答案:

答案 0 :(得分:1)

基数R中的

findInterval在这里可能会有所帮助。例如,

将VarA和VarB强制转换为Date对象,并使用findInterval创建一个新列,其中df2中的行(即VarB索引)与您为每个VarA指定的条件相匹配。

df1$row_match <- findInterval(as.Date(df1$varA), as.Date(df2$varB))

然后在

上创建新的相应列(df2中的行)以加入/合并
df2$row_match <- seq_len(nrow(df2))

df3 <- merge(df1, df2, by = "row_match")
#> df3
#  row_match       varA       varB   varC
#1         1 2018-01-03 2018-01-02 201801
#2         2 2018-01-06 2018-01-05 201802
#3         3 2018-01-15 2018-01-13 201804
#4         4 2018-01-25 2018-01-21 201809

答案 1 :(得分:1)

您可以使用data.table进行左连接:

varA <- c('2018-01-03', '2018-01-25','2018-01-15','2018-01-06')
varB <- c('2018-01-02', '2018-01-05', '2018-01-13', '2018-01-21', '2018-01-26')
varC <- c(201801,201802,201804,201809,201815)

library(lubridate)
dt1 <- data.table(varA = ymd(varA))
dt2 <- data.table(varA = ymd(varB), varB = ymd(varB), varC =  varC)
setkey(dt1, varA)
setkey(dt2, varA)

dt2[dt1,, roll = T]

答案 2 :(得分:-1)

你可以尝试

library(tidyverse)
map(df1$varA, function(x)  df2[between(df2$varB, x, x),]) %>% 
  bind_rows() %>% 
  bind_cols(df1,.)
        varA       varB   varC
1 2018-01-03 2018-01-02 201801
2 2018-01-25 2018-01-21 201809
3 2018-01-15 2018-01-13 201804
4 2018-01-06 2018-01-05 201802

我们的想法是使用tidyverse函数map&amp;找到间隔。 between,然后添加df1