2014-09-22 2 views
0

У меня есть набор данных со многими переменными. Интересующими являются: ID, эпизод, начало, конец, дата оценки. Примерный набор данных показанСоздание повторяющихся дат начала и окончания

ID Episode  Start   End AssessmentDate 
1  1 1/1/2012 12/21/2012  1/1/2012 
1  1 1/1/2010 12/21/2012  12/12/2012 
1  1 1/1/2010 12/21/2012  12/21/2012 
1  2 1/1/2013   .  1/2/2013 
1  2 1/1/2013   .  2/2/2013 
1  2 1/1/2013   .  3/2/2013 
2  1 1/1/2012   .  4/1/2012 
2  1 1/1/2010   .  5/12/2012 
2  1 1/1/2010   .  6/21/2012 
2  2 1/1/2013   .  7/2/2013 
2  2 1/1/2013   .  8/2/2013 
2  2 1/1/2013   .  9/2/2013 

У меня есть даты начала для всех, но не даты окончания. Я хочу определить дату окончания каждого эпизода и каждого пациента для 10 000 пациентов. Я хочу, чтобы дата окончания была последней датой оценки для каждого номера эпизода, и я хочу, чтобы она присутствовала для каждой строки между первой и последней датами оценки.

Я читал немного о разделении набора данных на многие более мелкие части, основанные на ID и Эпизоде, но я чувствую, что должен быть более простой способ сделать это. Я новичок в R, я пришел из SAS, и проблема, подобная этой проблеме в SAS, не принесла бы мне слишком больших проблем.

Буду признателен за любые данные, которые могут возникнуть в отношении подготовки данных.

+0

Я согласен. Возможно, вам захочется изменить данные примера на то, что лучше отражает ваши фактические данные –

ответ

1

Вы можете найти максимальную дату оценки по эпизоду с использованием ddply() из plyr библиотеки:

df <- data.frame(id=1, Episode=c(1,1,1,2,2,2), AssessmentDate=as.Date(c("2012-01-01", "2012-12-12", "2012-12-21", "2013-01-02", "2013-02-02", "2013-03-02"))) 

library(plyr) 

df <- ddply(df, .(Episode), transform, End=max(AssessmentDate)) 
df 

Который дает вам:

ID Episode AssessmentDate  End 
1 1  1  2012-01-01 2012-12-21 
2 1  1  2012-12-12 2012-12-21 
3 1  1  2012-12-21 2012-12-21 
4 1  2  2013-01-02 2013-03-02 
5 1  2  2013-02-02 2013-03-02 
6 1  2  2013-03-02 2013-03-02 

Если вы хотите сделать его пациентом, вы можете использовать ddply() с .(ID) (при условии, что идентифицирует пациентов) или что-то в этом роде.

Это также возможно сделать с помощью by(), но становится немного более сложным, поскольку он будет разбивать данные на списки, идентифицированные значениями переменной группировки.

Редактировать: также, если Episode не является уникальным по всему кадру данных, то есть он повторяется для каждого пациента, вы можете группировать по обеим переменным, то есть ddply(df, .(ID, Episode), ...).

1

Предполагая, что вы правильно прочитали свои значения как Даты и обработали «.». как значение NA в R, ваш кадр данных образец должен иметь такую ​​структуру

dd<-structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L), Episode = c(1L, 
1L, 1L, 2L, 2L, 2L), Start = structure(c(15340, 14610, 14610, 
15706, 15706, 15706), class = "Date"), End = structure(c(15695, 
15695, 15695, NA, NA, NA), class = "Date"), AssessmentDate = structure(c(15340, 
15686, 15695, 15707, 15738, 15766), class = "Date")), .Names = c("ID", 
"Episode", "Start", "End", "AssessmentDate"), row.names = c(NA, 
-6L), class = "data.frame") 

Вы можете рассчитать максимальную дату оценки за эпизод с помощью функции базового ave() с

dd$NewEnd <- ave(dd$AssessmentDate, dd$Episode, FUN=max) 

, который дает

ID Episode  Start  End AssessmentDate  NewEnd 
1 1  1 2012-01-01 2012-12-21  2012-01-01 2012-12-21 
2 1  1 2010-01-01 2012-12-21  2012-12-12 2012-12-21 
3 1  1 2010-01-01 2012-12-21  2012-12-21 2012-12-21 
4 1  2 2013-01-01  <NA>  2013-01-02 2013-03-02 
5 1  2 2013-01-01  <NA>  2013-02-02 2013-03-02 
6 1  2 2013-01-01  <NA>  2013-03-02 2013-03-02 

Здесь я не перезаписывал существующие значения End. Я не был уверен, что нужно делать в тех случаях, когда он не соответствует.

1

Или используя data.table (данные из @MrFlicks пост)

library(data.table) 
setDT(dd)[, NewEnd:=max(AssessmentDate), by=Episode] 
dd 
#  ID Episode  Start  End AssessmentDate  NewEnd 
#1: 1  1 2012-01-01 2012-12-21  2012-01-01 2012-12-21 
#2: 1  1 2010-01-01 2012-12-21  2012-12-12 2012-12-21 
#3: 1  1 2010-01-01 2012-12-21  2012-12-21 2012-12-21 
#4: 1  2 2013-01-01  <NA>  2013-01-02 2013-03-02 
#5: 1  2 2013-01-01  <NA>  2013-02-02 2013-03-02 
#6: 1  2 2013-01-01  <NA>  2013-03-02 2013-03-02 

Или dplyr

library(dplyr) 
dd %>% 
    group_by(Episode) %>% 
    mutate(NewEnd=max(AssessmentDate)) 
Смежные вопросы