2016-04-13 5 views
0

Ich habe einen Datensatz wie untenWie Zeilenwerte summieren, wenn das Datum zwischen zwei Terminen in bestimmten Zeile ist

patient number drugtype date date - 1 year date + 1 year 
    11    G5  1/1/15 1/1/14   1/1/16 
    16    G5  5/4/13 5/4/12   5/4/14 
    19    R6  2/1/12 2/1/11   2/1/13 
    11    G5  7/4/14 7/4/13   7/4/15 
    19    R6  4/6/11 4/6/10   4/6/12 
    16    G5  3/2/12 3/2/11   3/2/13 
    32    G5  2/4/14 2/4/13   2/4/15 
    11    G5  1/1/10 1/1/9   1/1/11 
    16    G5  1/4/15 1/3/14   1/4/16 
    11    G5  31/12/15 31/12/14  31/12/16 

Ich versuche, die Anzahl, wie oft ein Medikament zu finden, für einen einzigartigen Patient innerhalb eines Jahres vorgeschrieben ist ihre Drogen zu nehmen, um mit einer Tabelle wie folgt zu enden:

patient number drugtype date date - 1 year date + 1 year number of prescriptions within year 
    11    G5  1/1/15 1/1/14   1/1/16  3 
    16    G5  5/4/13 5/4/12   5/4/14  1 
    19    R6  2/1/12 2/1/11   2/1/13  2 
    11    G5  7/4/14 7/4/13   7/4/15  2 
    19    R6  4/6/11 4/6/10   4/6/12  2 
    16    G5  3/2/12 3/2/11   3/2/13  1 
    32    G5  2/4/14 2/4/13   2/4/15  1 
    11    G5  1/1/10 1/1/9   1/1/11  1 
    16    G5  1/4/15 1/3/14   1/4/16  1 
    11    G5  31/12/15 31/12/14  31/12/16 2 

so logisch ich brauche, um durch die Zeilen, in denen numberofprescriptionswithinayear <- ifelse(patient number=x & drugtype=y & date > date-1year & date+1year, 1, 0) und sum.

Gibt es einen einfacheren Weg zum Durchschleifen, da ich auch weitere Variablen wie die Anzahl der Verschreibungen von G5 innerhalb eines Jahres und die Anzahl der Verschreibungen von R6 innerhalb eines Jahres hinzufügen muss.

Die Berechnung der Anzahl der Rezepte, die ich gemacht habe, ist falsch. Wie es berechnet wird ist, ob wie viele andere Rezepte ein Jahr um das tatsächliche Datum (das liegt zwischen dem Plus eins und minus eins) gegeben wird - sorry für jeden Mangel an Klarheit.

+0

Ich verstehe deinen Finaltisch nicht. Patient Nummer 11 erhielt G5 am 01.01.15, 04.07.14, 01.01.10 und 31.12.15. Sie zählen 3,2,1,1 für diese Zeitpunkte. Bitte geben Sie Ihre Berechnungen genauer an. – Jimbou

+0

Bitte geben Sie ein reproduzierbares Beispiel an, das reicht nicht aus, um damit sinnvoll zu arbeiten. –

+0

geklärt und korrigiert Berechnung – user1745691

Antwort

1

Ich denke, die Werte in Ihrer Tabelle der erwarteten Ausgabe sind falsch.

Sie können Ihr Ergebnis mit data.table erreichen, indem Sie Ihre Daten mit sich selbst verbinden, dann eine einfache Teilmenge & Berechnung tun

library(data.table) 

## data (with formatted headings & date types) 
dt <- structure(list(patient_number = c(11L, 16L, 19L, 11L, 19L, 16L, 
32L, 11L, 16L, 11L), drugtype = structure(c(1L, 1L, 2L, 1L, 2L, 
1L, 1L, 1L, 1L, 1L), .Label = c("G5", "R6"), class = "factor"), 
    date = structure(c(16436, 15800, 15341, 16167, 15129, 15373, 
    16162, 14610, 16526, 16800), class = "Date"), previous_year = structure(c(16071, 
    15435, 14976, 15802, 14764, 15008, 15797, 14245, 16130, 16435 
    ), class = "Date"), next_year = structure(c(16801, 16165, 
    15707, 16532, 15495, 15739, 16527, 14975, 16892, 17166), class = "Date")), .Names = c("patient_number", 
"drugtype", "date", "previous_year", "next_year"), row.names = c(NA, 
-10L), class = c("data.table", "data.frame")) 

setDT(dt) 

dt[ dt, on=c("patient_number", "drugtype"), allow.cartesian = T ## join it all together 
    ][ 
     previous_year <= i.date & i.date <= next_year    ## filter results 
     ][ 
     , .(n_count = .N), by=.(patient_number, drugtype, date) ## do the calculation 
     ] 

#  patient_number drugtype  date n_count 
# 1:    11  G5 2015-01-01  3 
# 2:    11  G5 2014-04-07  2 
# 3:    11  G5 2015-12-31  2 
# 4:    16  G5 2013-04-05  1 
# 5:    19  R6 2012-01-02  2 
# 6:    19  R6 2011-06-04  2 
# 7:    16  G5 2012-02-03  1 
# 8:    32  G5 2014-04-02  1 
# 9:    11  G5 2010-01-01  1 
# 10:    16  G5 2015-04-01  1 

Eine alternative Methode aber gibt das gleiche Ergebnis

dt[ dt, 
    { 
     idx = i.previous_year <= date & date <= i.next_year 
     .(date = date[idx], 
     previous_year = previous_year[idx], 
     next_year = next_year[idx]) 
    }, 
    on=c("patient_number", "drugtype"), 
    by=.EACHI 
    ][, .(n_count = .N), by=.(patient_number, drugtype, date)] 
+0

Ich erhalte den Fehler Fehler in '[.data.table' (dt, dt, ein = c (" patient_number "," droptype "," Datum "),: unbenutztes Argument (on = c ("patient_number", "drugtype", "date")) " – user1745691

+0

@ user1745691 verwenden Sie die neueste Version von data.table? – SymbolixAU

+0

aktualisierte data.table - arbeiten jetzt - danke – user1745691

1

Ich kann nicht kommentieren, weil ich nicht genügend Ansehen erhalten habe. Mit dem Paket lubridate --> int_overlaps() können Sie bestimmen, ob eine Datetime in einem Intervall von zwei anderen Datumsangaben ist. das könnte dir helfen.

Verwandte Themen