Подсчет строк во внешнем фрейме данных - PullRequest
0 голосов
/ 04 мая 2018

Рассмотрим следующую проблему: у меня есть два кадра данных cases и events. Для каждого case может быть несколько events (1: n). события $ caseId (внешний ключ) относятся к случаям $ id (первичный ключ):

cases       events
------      ------
id          id
date        caseId
var1        date
var2        var1
...         var2
            ...

Теперь я хотел бы создать новый столбец в cases, в котором будет указано количество событий для каждого случая (то есть, когда события $ caseId равны случаям $ id)

# Sample data            
cases<-data.frame(id=1:5, date=c("2017-01-02","2016-02-03","2015-02-12","2016-01-03","2016-08-09"), var1=sample(c("A", "B"), 5, replace=T))
events<-data.frame(id=1:10, date=c("2017-01-01","2016-12-12","2016-07-04","2017-04-03","2015-02-13","2015-01-01","2013-05-07","2015-12-25","2016-05-04","2016-10-11"), caseId=c(1,1,1,1,3,3,3,4,5,5))

# Calculate the number of events for every caseId
library(tidyverse)
events %>%  
  count(caseId) %>%
  right_join(cases, by = c("caseId" = "id"))

Проблема, с которой я столкнулся, состоит в том, что я хочу подсчитать только те события, которые произошли после даты, указанной в case -данных (то есть события $ date> case $ date) .

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 04 мая 2018

Вы можете выполнить неравное объединение с пакетом data.table (столбцы date необходимо сначала преобразовать в формат даты, см. Ниже под заголовком Data ):

library(data.table)
setDT(cases)
setDT(events)

cases[events, on = .(id = caseId, date < date), events := .N, by = .EACHI][]

Результат:

   id       date var1 events
1:  1 2017-01-02    B      1
2:  2 2016-02-03    A     NA
3:  3 2015-02-12    A      1
4:  4 2016-01-03    B     NA
5:  5 2016-08-09    B      1

Вариант этого:

cases[, events := events[cases, on = .(caseId = id, date > date), .N, by = .EACHI]$N][]

Результат этого:

   id       date var1 events
1:  1 2017-01-02    A      1
2:  2 2016-02-03    A      0
3:  3 2015-02-12    A      1
4:  4 2016-01-03    A      0
5:  5 2016-08-09    A      1

Данные:

cases <- data.frame(id=1:5, date=c("2017-01-02","2016-02-03","2015-02-12","2016-01-03","2016-08-09"),
                    var1=sample(c("A", "B"), 5, replace=T))
events <- data.frame(id=1:10,
                     date=c("2017-01-01","2016-12-12","2016-07-04","2017-04-03","2015-02-13","2015-01-01","2013-05-07","2015-12-25","2016-05-04","2016-10-11"),
                     caseId=c(1,1,1,1,3,3,3,4,5,5))
cases$date <- as.Date(cases$date)
events$date <- as.Date(events$date)
...