2017-03-21 4 views
0

Ich fange gerade an, R zu lernen, was wirklich nützlich war, und ich versuche es zu verwenden, um den Anteil der Tage zu berechnen, die abgedeckt sind. Diese Messgröße hat mit der Messung der Einhaltung der Medikation durch eine Person zu tun. Im Grunde genommen finden Sie für einen bestimmten Zeitraum alle Füllungen eines Medikaments anhand des Fülldatums und der Anzahl der Tage in der Lieferung, um festzustellen, für welche Tage sie abgedeckt waren. Z.B. Wenn eine Person am 01.02.2016 eine 35-tägige Befüllung erhält, hat sie eine Deckung vom 01.02.16 bis zum 06.06.2016. Leicht genug.PDC-Berechnung in R - Entfernen von Schleifen

Dies wird schwierig, wenn sie für eine Füllung zurückgehen, bevor sie aus der Deckung bei der ersten Füllung, Sie nicht doppelt zählen Tage (zB die Person erhält ihre zweite Füllung am 01.03.2016, 3/1 -3/6 werden nur einmal gezählt).

Ich habe tatsächlich etwas Code geschrieben, der richtig zu funktionieren scheint, aber seine Verwendung von FOR-Schleifen, die ich gelernt habe, funktionieren nicht gut in R und ich mache mir Sorgen, wenn ich anfange, einen Haufen zu werfen Daten bei ihm.

Hier ist der erste Teil des Codes, der einige Variablen, die Testdaten und initialisiert baut:

#Create test data vectors 

    Person <- c(rep("Person1",12),rep("Person2",9)) 
    FillDate <- c("2016-1-1", "2016-2-1", "2016-3-1", "2016-4-1", "2016-5-1", "2016-6-1", "2016-7-1", "2016-8-1", "2016-9-1", "2016-10-1", "2016-11-1", "2016-12-1", "2016-2-1", "2016-3-1", "2016-4-20", "2016-5-1", "2016-6-1", "2016-7-1", "2016-8-1", "2016-9-1", "2016-10-1") 
    DaysSupply <- c(rep("35", 14), "20", "5", "20", rep("35", 4)) 

    #Build into data.frame 
    PDCTestData <- cbind.data.frame(as.factor(Person),as.Date(FillDate,"%Y-%m-%d"),as.numeric(DaysSupply)) 
    colnames(PDCTestData) <- c("Person","FillDate","DaysSupply") 

#Create start and end dates for overall period 
StartDate <- as.Date("2016-01-01") 
EndDate <- as.Date("2016-12-31") 

#Initialize DaysCoveredList, a vector to hold the list of dates that a person has drug coverage 
DaysCoveredList <- NULL 

#Initialize DaysCoveredTable, a matrix to count the total number of unique days in the DaysCovered List, by person 
DaysCoveredTable <- NULL 

und der zweite Teil, der die eigentliche Arbeit macht:

#Begin looping through individuals 
for(p in levels(PDCTestData$Person)){ 

    #Begin looping through drug fills 
    for(DrugSpan in 1:nrow(PDCTestData[PDCTestData$Person == p,])){ 

    #Create a sequence of the dates covered by that fill, the sequence starts on the fill date and runs for the number of days in Days Supply, Builds a list of all days covered for that person 
    DaysCoveredList <- c(DaysCoveredList,seq.Date(from = PDCTestData[PDCTestData$Person == p,][DrugSpan,]$FillDate, length.out = PDCTestData[PDCTestData$Person == p,][DrugSpan,]$DaysSupply, by = "day")) 

    } #Exit drug fill loop 

    #Counts the number of unique days covered from the DaysCovredList, with in the start and end of the overall period 
    DaysCovered <- length(unique(DaysCoveredList[DaysCoveredList >= StartDate & DaysCoveredList <= EndDate])) 

    #Adds the unique count from DaysCovered to the summary DaysCoveredTable 
    DaysCoveredTable <- rbind(DaysCoveredTable,cbind(p,DaysCovered)) 

    #Clear DaysCovered and DaysCovredList 
    DaysCovered <- NULL 
    DaysCoveredList <- NULL 
} #Exit the individual loop 

Jede Ihnen helfen können Angebot wird geschätzt.

Danke.

+0

Bevor Sie davon ausgehen, dass Sie Ihre kostbare Zeit für die Optimierung aufwenden müssen, versuchen Sie es doch einmal mit einer Million Zeilen (oder wie viele Sie auch bewältigen müssen) und sehen Sie, ob es langsam ist? Tun Sie einfach 'PDCTestData <- PDCTestData [rep (1:21, 100000),]' und sehen Sie, was passiert. – dash2

Antwort

0
library(lubridate) 
ptd <- PDCTestData # I get bored writing long variable names 

ptd$EndDate <- ptd$FillDate + ptd$DaysSupply 
ptd$DrugInterval <- interval(ptd$FillDate, ptd$EndDate) 

all_days <- as.Date(StartDate:EndDate, origin = "1970-01-01") 

lapply(unique(ptd$Person), function (y) sum(sapply(all_days, function (x) any(x %within% ptd$DrugInterval[ptd$Person==y])))) 

keine Garantien über die Geschwindigkeit, aber vielleicht leichter zu lesen.