2016-01-19 2 views
1
df 

Patient_ID ADM_DATE DIS_DATE 
278328 4/17/2007 4/19/2007 
279347 2/6/2012 2/7/2012 
279347 2/28/2012 3/3/2012 
287171 1/11/2012 1/14/2012 
287171 1/23/2013 2/4/2013 
353079 7/12/2011 7/15/2011 
608639 10/5/2010 10/7/2010 
608639 2/16/2012 2/19/2012 
608639 5/2/2012 5/4/2012 
608639 11/27/2012 12/4/2012 

Мне нужно найти время до следующего приема для данного пациента. Мне нужно будет добавить новый столбец, который вычитает ADM_DATE из DIS_DATE (предыдущей строки) для каждого Patient_ID.Использование R для вычитания последующих строк для заданного значения

Моего конечный продукт должен выглядеть следующим образом

df1 

Patient_ID ADM_DATE DIS_DATE Time_to_readmission 
278328 4/17/2007 4/19/2007 NA 
279347 2/6/2012 2/7/2012 NA 
279347 2/28/2012 3/3/2012 21 
287171 1/11/2012 1/14/2012 NA 
287171 1/23/2013 2/4/2013 375 
353079 7/12/2011 7/15/2011 NA 
608639 10/5/2010 10/7/2010 NA 
608639 2/16/2012 2/19/2012 497 
608639 5/2/2012 5/4/2012 73 
608639 11/27/2012 12/4/2012 207 

Пожалуйста, помогите мне с необходимым кодированием, я относительно новым для R. Заранее спасибо.

ответ

3

Вот быстрый data.table реализации. Сначала мы перейдем к соответствующим классам Date, затем мы запустим ADM_DATE - shift(DIS_DATE) на Patient_ID и завершим его в as.integer (или нет), поскольку вам кажется, что вы хотите integer класс, а не difftime.

library(data.table) 
setDT(df)[, 2:3 := lapply(.SD, as.IDate, "%m/%d/%Y"), .SDcols = -1] 
df[, Diff := as.integer(ADM_DATE - shift(DIS_DATE)), by = Patient_ID] 
df 
#  Patient_ID ADM_DATE DIS_DATE Diff 
# 1:  278328 2007-04-17 2007-04-19 NA 
# 2:  279347 2012-02-06 2012-02-07 NA 
# 3:  279347 2012-02-28 2012-03-03 21 
# 4:  287171 2012-01-11 2012-01-14 NA 
# 5:  287171 2013-01-23 2013-02-04 375 
# 6:  353079 2011-07-12 2011-07-15 NA 
# 7:  608639 2010-10-05 2010-10-07 NA 
# 8:  608639 2012-02-16 2012-02-19 497 
# 9:  608639 2012-05-02 2012-05-04 73 
# 10:  608639 2012-11-27 2012-12-04 207 

Или же идея с dplyr

library(dplyr) 
df %>% 
    mutate_each(funs(as.Date(., "%m/%d/%Y")), -1) %>% 
    group_by(Patient_ID) %>% 
    mutate(Diff = as.integer(ADM_DATE - lag(DIS_DATE))) 
+0

Ницца с 'data.table' – akrun

+0

Я ничего не говорил о' dupe' :-) – akrun

0

Хорошо, я неправильно понял первый раз, когда прочитал, но на этот раз он должен работать.

Код:

# Create a column that contains only NAs 
df1$Time_to_readmission <- NA 

# Make sure that the df is sorted by Patient_ID 
df1 <- df1[order(df1$Patient_ID),] 

# Basically, find the indices that are the same as the previous row 
ind <- which(c(FALSE,diff(df1$Patient_ID) == 0)) 

# Calculate the difference between DIS_DATE of the previous row and ADM_DATE of the index row 
differences <- as.Date(df1$ADM_DATE[ind], format="%m/%d/%Y") - as.Date(df1$DIS_DATE[ind - 1],format="%m/%d/%Y") 

# Store those differences in Time_to_readmission 
df1$Time_to_readmission[ind] <- differences 
0

Я бы первым форматировать data.frame

df[ , 2] <- as.Date(df[ , 2], format = "%m/%d/%Y") 
df[ , 3] <- as.Date(df[ , 3], format = "%m/%d/%Y") 

, а затем отделить его от пациента (для каждого уникального поиска пациента для каждого пациента с этим идентификатором):

dfList <- lapply(unique(df$Patient_ID), function(x) df[which(df$Patient_ID == x), ]) 

Теперь dfList - это список с data.frame в каждом элементе. Теперь проверьте каждый элемент списка.

dfList2 <- lapply(dfList, function(x){ 
    if (nrow(x)>1){ 
    Diff <- c(NA) 
    for (i in 2:nrow(x)){ 
     Diff[i] <- difftime(x[i,2], x[i-1,3]) 
    } 
    cbind(x, Time_to_readmission = Diff) 
    } else { 
    cbind(x, Time_to_readmission = NA) 
    } 
}) 

Теперь поместите его ALLtogether:

do.call("rbind", dfList2) 

Это, вероятно, не самый изящный способ, но я думаю, что это работает, и это понятно.

Смежные вопросы