Join one data frame to another by membership in a range
r
Solution
You can use `findInterval` to match a time with the corresponding `onset`, then `merge` your two data.frames:
df1$onset <- df2$onset[findInterval(df1$time, df2$onset)]
df3 <- merge(df1, df2, by = "onset")
head(df3)
# onset time offset
# 1 0 0.000 0.799
# 2 0 0.003 0.799
# 3 0 0.006 0.799
# 4 0 0.009 0.799
# 5 0 0.012 0.799
# 6 0 0.015 0.799
tail(df3)
# onset time offset
# 995 2.4 2.982 3
# 996 2.4 2.985 3
# 997 2.4 2.988 3
# 998 2.4 2.991 3
# 999 2.4 2.994 3
# 1000 2.4 2.997 3
Problem
I have two data frames that look like something like the following: ``` df1 <- data.frame(time=seq(0.0, by = 0.003, length.out = 1000)) time 1 0.000 2 0.003 3 0.006 4 0.009 5 0.012 6 0.015 ... df2 <- data.frame(onset=c(0.0, 0.8, 1.9, 2.4), offset=c(0.799, 1.899, 2.399, 3.0)) onset offset A B 1 0.0 0.799 ... ... 2 0.8 1.899 ... ... 3 1.9 2.399 ... ... 4 2.4 3.000 ... ... ``` In reality there are more columns in each of the data frames, and there are many more times in the first data frame and they're not regularly spaced; there aren't too many more rows in the second data frame. I want to merge the two data frames such that each row in the first data frame gets the extra columns for the appropriate range from the second data frame, and I want to do it efficiently because there are hundreds of thousands of rows involved.