Подмножество времени по эталонному времени для определенной группы в г - PullRequest
0 голосов
/ 10 июля 2019

У меня есть два фрейма данных,
aa имеет start и stop время событий - много в день
prbb имеет время start и stop моего интереса к этим событиям - один start и один stop в день на событие.
Я хотел бы извлечь множество событий из aa, которые попадают в промежуток времени этого дня для этого события из prbb

aa <- data.frame(aaletters = c(rep("a",7), rep("b", 3),rep("c", 1)),
         aastart = as.POSIXct(c("2019-05-02 05:06:35","2019-05-02 12:06:35", "2019-05-03 08:15:52", "2019-05-03 09:15:52", "2019-05-06 05:51:37",
                                  "2019-05-06 07:01:37","2019-05-06 09:51:37","2019-05-02 07:15:32", "2019-05-03 12:14:04", "2019-05-06 12:24:37",
                                  "2019-05-02 03:15:32"
         )),
         aastop = as.POSIXct(c("2019-05-02 05:15:30", "2019-05-02 12:15:30", "2019-05-03 08:44:08","2019-05-03 09:44:08", "2019-05-06 06:51:37",
                               "2019-05-06 07:02:37","2019-05-06 10:02:37","2019-05-02 08:15:32", "2019-05-03 13:41:16", "2019-05-06 13:24:43",
                               "2019-05-02 03:35:32"
                                  )))

prbb <- data.frame(prbbletters = c(rep("a", 3), rep("b", 3), rep("c",3)), 
         prstart = as.POSIXct(c("2019-05-02 06:06:35", "2019-05-03 06:15:52", "2019-05-06 07:51:37", "2019-05-02 06:15:32", "2019-05-03 08:14:04", 
                                "2019-05-06 06:24:37","2019-05-02 06:14:19", "2019-05-03 06:41:35", "2019-05-06 06:17:50"
                                  )),
         prstop = as.POSIXct(c("2019-05-02 23:18:30", "2019-05-03 20:44:08", "2019-05-06 22:37:20", "2019-05-02 23:24:27", "2019-05-03 19:41:16", 
                               "2019-05-06 23:24:43","2019-05-02 19:50:52", "2019-05-03 23:57:47", "2019-05-06 23:56:39"
                                  )))

Я попробовал это, но это не сработало, оно игнорирует by=

setDT(aa)
setDT(prbb)
aa[inrange(aa$aastart, prbb$prstart, prbb$prstop, incbounds = FALSE) & inrange(aa$aastop, prbb$prstart, prbb$prstop, incbounds = FALSE), by = prbletters]

setDT(aa)
setkey(aa, aastart, aastop)
setDT(prbb)
setkey(prbb, prstart, prstop)
foverlaps(aa, prbb, nomatch = NULL, mult = "first")[ ,  by = prbbletters]

Я также пытался fuzzy_joins, но я не могу правильно объединить группировку.

#      expected result: 7 rows
#  1: a 2019-05-02 12:06:35 2019-05-02 12:15:30
#  2: a 2019-05-03 08:15:52 2019-05-03 08:44:08
#  3: a 2019-05-03 09:15:52 2019-05-03 09:44:08
#  4: a 2019-05-06 09:51:37 2019-05-06 10:02:37
#  5: b 2019-05-02 07:15:32 2019-05-02 08:15:32
#  6: b 2019-05-03 12:14:04 2019-05-03 13:41:16
#  7: b 2019-05-06 12:24:37 2019-05-06 13:24:43

Заранее спасибо!

1 Ответ

2 голосов
/ 10 июля 2019

похоже, что вы были близки ... просто нужно было добавить буквы в качестве ключа перед использованием foverlaps.

из справки:
Последние два столбца в by.x и by.y должны соответствовать столбцам начала и конца интервала в x и y соответственно.

Итак, установите все ключи, на которые вы хотите наложить-соединить, и убедитесь, что последние две клавиши start и end .

setDT(aa)
setDT(prbb)
setkey(aa, aaletters, aastart, aastop)     # <-- added aalatters as first key !!
setkey(prbb, prbbletters, prstart, prstop) # <-- added prbbletters as key !!

foverlaps(aa, prbb, mult = "first", nomatch = 0L)

#    aaletters             prstart              prstop             aastart              aastop
# 1:         a 2019-05-02 06:06:35 2019-05-02 23:18:30 2019-05-02 12:06:35 2019-05-02 12:15:30
# 2:         a 2019-05-03 06:15:52 2019-05-03 20:44:08 2019-05-03 08:15:52 2019-05-03 08:44:08
# 3:         a 2019-05-03 06:15:52 2019-05-03 20:44:08 2019-05-03 09:15:52 2019-05-03 09:44:08
# 4:         a 2019-05-06 07:51:37 2019-05-06 22:37:20 2019-05-06 09:51:37 2019-05-06 10:02:37
# 5:         b 2019-05-02 06:15:32 2019-05-02 23:24:27 2019-05-02 07:15:32 2019-05-02 08:15:32
# 6:         b 2019-05-03 08:14:04 2019-05-03 19:41:16 2019-05-03 12:14:04 2019-05-03 13:41:16
# 7:         b 2019-05-06 06:24:37 2019-05-06 23:24:43 2019-05-06 12:24:37 2019-05-06 13:24:43
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...