Объединение двух кадров данных на основе диапазонов в обоих в R - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть два фрейма данных в 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 и 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

Я пытался использовать кучу функций применения и других методов, но я не смог понять это. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 05 ноября 2018

Вы можете использовать пакет sqldf для объединения двух таблиц, я назову их tb1 и tbl2. Я предполагаю, что под «в пределах диапазона» вы подразумеваете, что интервал [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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...