R 通过范围中的成员资格将一个数据帧连接到另一个数据帧
我有两个数据帧,看起来类似于以下内容:R 通过范围中的成员资格将一个数据帧连接到另一个数据帧,r,R,我有两个数据帧,看起来类似于以下内容: 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
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 ... ...
df1您可以使用findInterval
将时间与相应的start
匹配,然后合并您的两个数据帧
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
df1$start您可以为每个元素准备一个因子,然后使用plyr::join:
# breaks for 'cut'
times=c(df2$onset[1],df2$offset)
# modified df1 to shorten the list
df1 <- data.frame(time=seq(0.0, by = 0.03, length.out = 100))
# Add a few columns to df2
df2 <- data.frame(onset=c(0.0, 0.8, 1.9, 2.4), offset=c(0.799, 1.899, 2.399, 3.0), A=c(1,2,3,4), B=c(5,6,7,8))
df2$ranges <-cut(df2$onset,times,include.lowest=T))
df1$ranges <-cut(df1$time,times,include.lowest=T,levels=levels(df2$ranges))
join(df1,df2,by='ranges')
head(join(df1,df2,by='ranges')[-2])
time onset offset A B
1 0.00 0 0.799 1 5
2 0.03 0 0.799 1 5
3 0.06 0 0.799 1 5
4 0.09 0 0.799 1 5
5 0.12 0 0.799 1 5
6 0.15 0 0.799 1 5
#中断为“剪切”
时间=c(df2$开始[1],df2$偏移)
#修改df1以缩短列表
df1使用sqldf
执行条件联接的第三个选项
> head(sqldf("select *
+ from df1 inner join df2
+ on (df1.time between df2.onset and df2.offset)"))
水头输出:
time onset offset
1 0.000 0 0.799
2 0.003 0 0.799
3 0.006 0 0.799
4 0.009 0 0.799
5 0.012 0 0.799
6 0.015 0 0.799
内部联接将消除不符合df2范围的时间。如果希望保留这些时间,并且在开始和结束时都有空值,则只需在上面的sqldf
函数中的SQL中使用左连接
,而不是内部连接