2015-05-22 4 views
15
में पिछले घटना के बाद से

मेरे सवाल यह है कि एक घटना पिछले कि आर में हुई बाद के दिनों की संख्या की गणना करने के नीचे डेटा का एक न्यूनतम उदाहरण है शामिल है:गणना दिनों आर

df <- data.frame(date=as.Date(c("06/07/2000","15/09/2000","15/10/2000","03/01/2001","17/03/2001","23/05/2001","26/08/2001"), "%d/%m/%Y"), 
event=c(0,0,1,0,1,1,0)) 
     date event 
1 2000-07-06  0 
2 2000-09-15  0 
3 2000-10-15  1 
4 2001-01-03  0 
5 2001-03-17  1 
6 2001-05-23  1 
7 2001-08-26  0 

एक द्विआधारी चर (घटना) में मूल्य 1 है जो दर्शाता है कि घटना हुई और 0 अन्यथा। बार-बार टिप्पणियों अलग अलग समय (date) उम्मीद उत्पादन पिछले घटना के बाद से दिन के साथ इस प्रकार है (tae) पर किया जाता है:

date  event  tae 
1 2000-07-06  0  NA 
2 2000-09-15  0  NA 
3 2000-10-15  1   0 
4 2001-01-03  0  80 
5 2001-03-17  1  153 
6 2001-05-23  1  67 
7 2001-08-26  0  95 

मैं इसी तरह की समस्याओं के उत्तर के लिए चारों ओर देखा है, लेकिन वे पता नहीं मेरी विशिष्ट समस्या मैं एक ऐसी ही पोस्ट (Calculate elapsed time since last event) से से विचारों को लागू करने की कोशिश की और नीचे निकटतम मैं समाधान के लिए मिल गया है है

library(dplyr) 
df %>% 
    mutate(tmp_a = c(0, diff(date)) * !event, 
     tae = cumsum(tmp_a)) 

कौन सा उत्पादन है कि नीचे दिखाया गया पैदावार नहीं है काफी उम्मीद:

 date event tmp_a tae 
1 2000-07-06  0  0 0 
2 2000-09-15  0 71 71 
3 2000-10-15  1  0 71 
4 2001-01-03  0 80 151 
5 2001-03-17  1  0 151 
6 2001-05-23  1  0 151 
7 2001-08-26  0 95 246 

इस या एक अलग दृष्टिकोण को ठीक करने के तरीके पर कोई सहायता की सराहना की जाएगी।

+0

@ पास्कल यदि यह आसान बनाता है तो पहले तीन प्रविष्टियों के लिए 'एनए' के ​​बजाय '0' के रूप में सेट करना ठीक होगा। – amo

+0

@ पास्कल 'as.Date ('2001-01-03') - as.Date ('2000-10-15') 80 दिनों का समय अंतर। यह नंबर है '2000-10-15' पर हुई पिछली घटना के दिनों के दिनों से। समझ में आता है? – amo

उत्तर

8

आप कुछ इस तरह की कोशिश कर सकते:

# make an index of the latest events 
last_event_index <- cumsum(df$event) + 1 

# shift it by one to the right 
last_event_index <- c(1, last_event_index[1:length(last_event_index) - 1]) 

# get the dates of the events and index the vector with the last_event_index, 
# added an NA as the first date because there was no event 
last_event_date <- c(as.Date(NA), df[which(df$event==1), "date"])[last_event_index] 

# substract the event's date with the date of the last event 
df$tae <- df$date - last_event_date 
df 

#  date event  tae 
#1 2000-07-06  0 NA days 
#2 2000-09-15  0 NA days 
#3 2000-10-15  1 NA days 
#4 2001-01-03  0 80 days 
#5 2001-03-17  1 153 days 
#6 2001-05-23  1 67 days 
#7 2001-08-26  0 95 days 
3

यह दर्दनाक है और आप प्रदर्शन खो देते हैं लेकिन आप एक for पाश के साथ यह कर सकते हैं:

datas <- read.table(text = "date event 
2000-07-06  0 
2000-09-15  0 
2000-10-15  1 
2001-01-03  0 
2001-03-17  1 
2001-05-23  1 
2001-08-26  0", header = TRUE, stringsAsFactors = FALSE) 


datas <- transform(datas, date = as.Date(date)) 

lastEvent <- NA 
tae <- rep(NA, length(datas$event)) 
for (i in 2:length(datas$event)) { 
    if (datas$event[i-1] == 1) { 
    lastEvent <- datas$date[i-1] 
    } 
    tae[i] <- datas$date[i] - lastEvent 

    # To set the first occuring event as 0 and not NA 
    if (datas$event[i] == 1 && sum(datas$event[1:i-1] == 1) == 0) { 
    tae[i] <- 0 
    } 
} 

cbind(datas, tae) 

date event tae 
1 2000-07-06  0 NA 
2 2000-09-15  0 NA 
3 2000-10-15  1 0 
4 2001-01-03  0 80 
5 2001-03-17  1 153 
6 2001-05-23  1 67 
7 2001-08-26  0 95 
1

पुराना सवाल है, लेकिन मैं रोलिंग के साथ प्रयोग किया गया था जुड़ता है और यह दिलचस्प पाया।

library(data.table) 
setDT(df) 
setkey(df, date) 

# rolling self-join to attach last event time 
df = df[event == 1, .(lastevent = date), key = date][df, roll = TRUE] 

# find difference between record and previous event == 1 record 
df[, tae := difftime(lastevent, shift(lastevent, 1L, "lag"), unit = "days")] 

# difftime for simple case between date and joint on previous event 
df[event == 0, tae:= difftime(date, lastevent, unit = "days")] 

> df 
     date lastevent event  tae 
1: 2000-07-06  <NA>  0 NA days 
2: 2000-09-15  <NA>  0 NA days 
3: 2000-10-15 2000-10-15  1 NA days 
4: 2001-01-03 2000-10-15  0 80 days 
5: 2001-03-17 2001-03-17  1 153 days 
6: 2001-05-23 2001-05-23  1 67 days 
7: 2001-08-26 2001-05-23  0 95 days 
संबंधित मुद्दे