匹配数据帧时标识符的范围

时间:2018-04-09 19:12:14

标签: r merge range intervals

我需要根据两个不同的标识符匹配两个数据帧,这些标识符是 date id ,在下面的示例中。但是,我需要为标识符设置&#34;范围&#34;:new_df <- merge(df1 , df2 , by = c(id , date +-1 day interval)此新数据框应包含[-1, +1]间隔内发生的所有观察。

下面的第一个数据包含每天的值,我只需要删除不在上述间隔内的观察值。 &#34;零&#34; -day将位于第二个数据框(df2)。

//第一个数据:

id <- c(a56 , a56 , a56 ,a56 ..., a1782)
date <-(1990-04-07 , 1990-04-08 , 1990-04-09 , 1990-04-10, ... , 1994-08-19)
value <- (0.003 , 0.023 , 0.127 , 0.278 , 0.378, ... ,0.378)
df1 <- data.frame(id ,date)

//第二个数据:

 id <- c(a56 , a78 , a99 , a101, a1893 , a167 , a1782)
 date <-c(1990-04-10 , 1990-08-18 , 1990-10-17, 1991-04-10 , 1994-08-18 ,1995-10-17)
 df2 <- data.frame(id , date)

期望的输出将遵循:

1. a56  1990-04-09  0.278
2. a56  1990-04-10  0.378
3. a56  1990-04-11  0.444 .....
9999. a1782 1994-08-18  0.345
1000. a17882 1994-08-19 0.378  

提前致谢!

1 个答案:

答案 0 :(得分:0)

所以我有点猜测您的数据是什么样的,因为您提供的示例代码并不完全有用(请在下次仔细检查)。

请注意,我将日期转换为Date

我在这里所做的只是加入id上的两个数据帧 ,所以我保留了两个日期列。我将df1的日期过滤到df2日期的+/- 1区间内,然后删除df1日期列。

id <- c('a56', 'a56', 'a56', 'a56', 'a1782')
date <- as.Date(c('1990-04-07' , '1990-04-08' , '1990-04-09' , '1990-04-10', '1994-08-19'))
value <- c(0.003 , 0.023 , 0.127 , 0.278, 0.378)
df1 <- data.frame(id ,date, value)
id <- c('a56' , 'a78' , 'a99' , 'a101', 'a1893' , 'a167')
date <- as.Date(c('1990-04-10' , '1990-08-18' , '1990-10-17', '1991-04-10' , '1994-08-18' ,'1995-10-17'))
df2 <- data.frame(id , date)

df = merge(df1, df2, by = 'id', suffixes = c('', '.y'))
df = df[df$date >= df$date.y - 1 & df$date <= df$date.y +1, 1:3]

我明白了:

   id       date value
3 a56 1990-04-09 0.127
4 a56 1990-04-10 0.278