我在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函数和其他方法,但是我无法弄清楚。任何帮助将不胜感激!
答案 0 :(得分:3)
您可以使用sqldf
包将两个表连接起来,我将它们称为tb1
和tbl2
。我以“在范围内”假设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)]