如何根据另一个表中的时间范围来匹配值?

时间:2019-03-06 17:29:55

标签: r pattern-matching data-analysis data-cleaning

我有两个表,如下所示:

table_A

x | date

1   03/06
1   03/15
2   12/04
3   06/23
3   10/05

table_B

x | y | start_date | end_date

1   a    03/02       03/08
1   b    03/09       03/20
1   c    03/21       12/30
2   j    01/08       12/10
3   i    06/21       07/30
3   h    07/31       12/30

我想通过首先将 table_A的x table_B的x 相匹配,并确保日期在table_B的start_date和end_date之内,将'y'列添加到table_A ,然后返回对应的y

table_A

x | date | y

1   03/06  a
1   03/15  b
2   12/04  j
3   06/23  i
3   10/05  h

如果能帮助我,那就太好了,谢谢!

1 个答案:

答案 0 :(得分:1)

您可能需要as.Date和适合您目的的时间格式(format = "%m/%d")。然后,您可以简单地测试每个特定的日期是否在每个时间范围内,并返回匹配的输出。

a <- read.table(text="
                x   date
                1   03/06
                1   03/15
                2   12/04
                3   06/23
                3   10/05", header=T, stringsAsFactors=F)

b <- read.table(text="
                x   y    start_date  end_date
                1   a    03/02       03/08
                1   b    03/09       03/20
                1   c    03/21       12/30
                2   j    01/08       12/10
                3   i    06/21       07/30
                3   h    07/31       12/30", header=T, stringsAsFactors=F)


out <- NULL
for (i in 1:nrow(a)){
  test <- (as.Date(a$date[i], format = "%m/%d") > as.Date(b$start_date, format = "%m/%d") &
             as.Date(a$date[i], format = "%m/%d") < as.Date(b$end_date, format = "%m/%d") & a$x[i]==b$x)
  out <- c(out, b$y[test])
}

a$y <- out
a

  x  date y
1 1 03/06 a
2 1 03/15 b
3 2 12/04 j
4 3 06/23 i
5 3 10/05 h