как посчитать количество событий на одном data.frame на основе периода времени на другом data.frame - PullRequest
0 голосов
/ 19 января 2019

У меня есть два кадра данных, один с ID, DATE и именем drug.У другого ID и дата события date.event.

  1. ожидаемый столбец prev_drug:
    как подсчитать количество разных лекарств до текущей даты?например, для ID = 1 prev_drug для строки 4 равно 2, поскольку в нем есть два препарата (A, B), отличных от препарата C до ДАТЫ строки 4.

2. ожидаемый столбецevent.30d.prior:
для каждого ID и каждого DATE в первом кадре данных, сколько событий произошло за 30 дней до DATE?например.для строки 2 событие для id=1 произошло в 1/20/2001 и относится к 30 дням до 2/1/2001 периода.

ID  DATE        DRUG    prev_drug   event.30d.prior     
1   1/1/2001    A       0           0       
1   2/1/2001    A       0           1       
1   3/15/2001   B       1           0       
1   4/20/2001   C       2           1           
1   5/29/2001   A       2           0           
1   5/2/2001    B       2           0           
2   3/2/2001    A       0           1           
2   3/23/2001   C       1           1           
2   4/4/2001    D       2           0           
2   5/5/2001    B       3           0   


ID  date.event
1   1/20/2001
1   4/11/2001
2   3/1/2001

1 Ответ

0 голосов
/ 20 января 2019

Вот решение с базой R с использованием некоторых методов dplyr.Это не самое чистое и лучшее решение, но оно должно решить вашу проблему.

df<-structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), 
DATE = structure(c(11323, 11354, 11396, 11432, 11471, 11444, 
11383, 11404, 11416, 11447), class = "Date"), DRUG = structure(c(1L, 
1L, 2L, 3L, 1L, 2L, 1L, 3L, 4L, 2L), .Label = c("A", "B", 
"C", "D"), class = "factor")), row.names = c(NA, -10L), class = "data.frame")
#Note DATE was converted to a Date object with the following line
#df$DATE<-as.Date(df$DATE, "%m/%d/%Y")

date.event<-read.table(header=TRUE, text="ID  date.event
1   1/20/2001
1   4/11/2001
2   3/1/2001")
date.event$date.event<-as.Date(date.event$date.event, "%m/%d/%Y")

library(dplyr)
#calculate the prev_drup by counting the number of unique drugs
df<-df %>% group_by(ID)  %>%  mutate(prev_drug= (cumsum(!duplicated(DRUG)))-1)


#loop through each row after spitting and filtering by ID
event.30d.prior<-sapply(1:nrow(df),  function(i){
       events<-date.event[date.event$ID==df$ID[i], "date.event"]
       sum(between(events, df$DATE[i]-30, df$DATE[i]))
})

finalanswer<-cbind(df, event.30d.prior=unlist(event.30d.prior))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...