[英]Combining two data frames based on ranges in both in R
我在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
我想得到一個如下所示的輸出,其中基於t1和t2在t2_1和t2_2的范圍內,從第二個表中提取t2_1,t2_2和label_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
我試過使用一堆應用函數和其他方法,但是我一直無法弄清楚。 任何幫助,將不勝感激!
您可以使用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)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.