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

问题描述 投票:1回答:1

我有两张表如下:

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匹配来将列'y'添加到table_A,方法是确保日期在table_B的start_date和end_date中,然后返回相应的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

如果你可以帮助我,那就太好了,谢谢!

r pattern-matching data-analysis data-cleaning
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.