Я пытаюсь найти элегантное решение data.table (но я возьму другое, если есть что-то лучше) о том, как комбинировать интервалы времени, которые имеют дело с (1) вложенными интервалами, (2) интервалы с различными приоритетами и (3) интервалы с пробелами (см. пример объекта ввода). Мне удалось найти почти успешное решение через foverlaps и shift. Я надеюсь избежать/в то время как петли или декартовые продукты, которые являются неэффективными и неэлегантными, но определенно будут работать. Я надеюсь, что есть что-то лучше, так как это общая проблема с данными, с которой я должен иметь дело. По запросу я покажу свое почти эффективное решение, если это будет полезно.с перекрытием интервалов дат с пробелами
require(data.table)
# my data looks somewhat like this...
input <- data.table(
person_ID = c(rep(98723, 4), rep(8534, 2), 11223, rep(22446, 2)),
team = c(rep("A", 4), rep("B", 2), "A", "B", "A"),
start_date = as.Date(c("2009-10-1", "2011-11-21", "2012-1-23", "2013-3-2",
"2009-11-14", "2010-1-1", "2012-1-2", "2011-2-2", "2012-4-3")),
end_date = as.Date(c("2010-5-23", NA, "2015-01-02", "2013-3-2", "2009-12-31",
"2010-3-1", "2015-03-22", "2016-1-2", "2014-9-30")))
team_priority <- data.table(team = c("A", "B"), priority = c(1, 2))
input[team_priority, priority := i.priority, on = "team"]
вход
person_ID team start_date end_date priority
1: 98723 A 2009-10-01 2010-05-23 1
2: 98723 A 2011-11-21 <NA> 1
3: 98723 A 2012-01-23 2015-01-02 1
4: 98723 A 2013-03-02 2013-03-02 1
5: 8534 B 2009-11-14 2009-12-31 2
6: 8534 B 2010-01-01 2010-03-01 2
7: 11223 A 2012-01-02 2015-03-22 1
8: 22446 B 2011-02-02 2016-01-02 2
9: 22446 A 2012-04-03 2014-09-30 1
# problem 1: gap in teams prevents simple min/max solution (see person_ID == 98723)
# problem 2: teams have priorities, so if team B is inside of time interval assigned to time A,
# then we need the records to reflect the following:
# team B -> team A -> team B based on when teams A & B start/stop (see person_ID == 22446)
# NOTE: problem 1 and 2 can be combined (I am trying to fix bad data entry)
# I have to assign priorities based on team involvement (A > B > C, etc)
output <- data.table(
person_ID = c(rep(98723, 4), rep(8534, 2), 11223, rep(22446, 3)),
team = c(rep("A", 4), rep("B", 2), "A", "B", "A", "B"),
start_date = as.Date(c("2009-10-1", "2011-11-21", "2012-1-23", "2013-3-2",
"2009-11-14", "2010-1-1", "2012-1-2", "2011-2-2", "2012-4-3", "2014-10-1")),
end_date = as.Date(c("2010-5-23", NA, "2015-01-02", "2013-3-2", "2009-12-31",
"2010-3-1", "2015-03-22", "2012-4-2", "2014-9-30", "2016-1-2")),
group_id = c(1, rep(2, 3), rep(4, 2), 5, 6, 7, 8))
выход
Простым MIN/MAX решение не будет работать! Я не против разобраться с вложенными интервалами (см. Person_id == 22446) отдельно, но это действительно та часть, которую я не смог понять, все еще получая все другие цели, встречающиеся в одно и то же время.