Сопоставить строки в кадре данных на основе нескольких условий - PullRequest
1 голос
/ 10 апреля 2019

У меня есть фрейм данных с действиями различных подразделений и датами начала и окончания этих действий. Мне нужно знать, есть ли подразделения, которые начали новую деятельность в течение 31 дня после ее завершения, и какими были эти действия (их идентификационные данные).

Я пытался использовать пакет dplyr: в частности, я использовал group_by(unit), а затем `суммировал, но я не вижу, как получить ответ.

# Dataframe
unit <- rep(LETTERS[1:4], c(2,2,3,3))
start <- as.Date(c("2017-02-28", "2018-03-26", "2017-08-01", "2018-01-23", "2016-08-29", "2016-12-12", "2017-04-12", "2016-11-01", "2016-11-08", "2017-04-03"))
end <- as.Date(c("2018-12-31", "2018-12-31", "2017-12-31", "2018-10-23", "2017-03-31", "2017-12-31", "2019-02-28", "2017-03-31", "2017-03-31", "2018-08-31"))

DF <- data.frame(unit, start, end)
> DF
   unit      start        end
1     A 2017-02-28 2018-12-31
2     A 2018-03-26 2018-12-31
3     B 2017-08-01 2017-12-31
4     B 2018-01-23 2018-10-23
5     C 2016-08-29 2017-03-31
6     C 2016-12-12 2017-12-31
7     C 2017-04-12 2019-02-28
8     D 2016-11-01 2017-03-31
9     D 2016-11-08 2017-03-31
10    D 2017-04-03 2018-08-31

Выходные данные, которые я хотел бы получить, были бы в виде кадра данных:

   unit      activity1        activity2
1     B              3               4
2     C              5               7
3     D              8              10
4     D              9              10

1 Ответ

0 голосов
/ 11 апреля 2019

Симона!

В вашем примере, например, действие 4 фактически начинается менее чем через 31 день после окончания действия 6, но оно не указано в желаемом результате - я полагаю, потому что эти действия принадлежат разным подразделениям.

Таким образом, я предполагаю, что вы хотите получить свои результаты на единицу.Вы можете сделать это так:

DF$no <- 1:nrow(DF)
spl <- split[DF, DF$unit]
output <- do.call(rbind, 
        lapply(split(DF, DF$unit), function(x){
          unit.activities <- c()
          for (i in 1:nrow(x)) {
            delta_end <- difftime(x$start[i], x$end)
            ended_last_month <- which(delta_end>=0 & delta_end<=31)
            if (length(ended_last_month)>0) {
              return(do.call(rbind, lapply(ended_last_month, function(j){c(as.character(x$unit[i]), x$no[j], x$no[i])})))
            }
          }
          return(as.data.frame(unit.activities))
        })
        )
names(output) <- c('unit', 'activity1', 'activity2')
rownames(output) <- 1:nrow(output)

> output
  unit activity1 activity2
1    B         3         4
2    C         5         7
3    D         8        10
4    D         9        10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...