基于R中两个范围的组合两个数据帧

时间:2018-11-05 18:46:05

标签: r dataframe join

我在R中有两个数据帧。每个数据帧都有开始和结束时间(分别标记为t1和t2)和相关的标签。一张桌子代表声音,一张桌子代表单词。我想根据每种声音的时间找出与每种声音相关联的单词。表格如下:

表1:

  t1         t2         label1       
1 0.09657247 0.14520627      j
2 0.14520627 0.21598818     a:
3 0.21598818 0.29489410      c
4 0.29489410 0.35215657      i

表2:

  t2_1       t2_2         label2
1 0.09657247 0.21598818    ja:
2 0.21598818 0.35215657     ci
3 0.35215657 0.53570333    pek
4 0.53570333 0.63220031     nu

我想获得一个类似以下的输出,其中t2_1,t2_2和label_2列是根据t1_1和t2在t2_1和t2_2范围内从第二个表中提取的。

  t1         t2         label1 t2_1       t2_2          label2    
1 0.09657247 0.14520627      j 0.09657247 0.21598818    ja:
2 0.14520627 0.21598818     a: 0.09657247 0.21598818    ja:
3 0.21598818 0.29489410      c 0.21598818 0.35215657    ci
4 0.29489410 0.35215657      i 0.21598818 0.35215657    ci

我尝试使用大量的Apply函数和其他方法,但是我无法弄清楚。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

您可以使用sqldf包将两个表连接起来,我将它们称为tb1tbl2。我以“在范围内”假设tha表示间隔[t1,t2]是间隔[t2_1,t2_2]的子集。

library(sqldf)
sqldf('
select  *
from    tbl1
        join tbl2
        on  t1 >= t2_1
            and t2 <= t2_2
')
#           t1        t2 label1       t2_1      t2_2 label2
# 1 0.09657247 0.1452063      j 0.09657247 0.2159882    ja:
# 2 0.14520627 0.2159882     a: 0.09657247 0.2159882    ja:
# 3 0.21598818 0.2948941      c 0.21598818 0.3521566     ci
# 4 0.29489410 0.3521566      i 0.21598818 0.3521566     ci

您还可以使用data.table(与上述结果相同)

data.table选项1:

library(data.table)
setDT(tbl1)
setDT(tbl2)

tbl1[tbl2, on = .(t1 >= t2_1, t2 <= t2_2)
     , .(t1, t2, label1, t2_1, t2_2, label2)]

data.table选项2

setkey(tbl1, t1, t2)
setkey(tbl2, t2_1, t2_2)

foverlaps(tbl1, tbl2, type = 'within')[, .(t1, t2, label1, t2_1, t2_2, label2)]