2014-09-22 54 views
0

我有一個包含很多變量的數據集。感興趣的有:ID,Episode,Start,End,Assessment Date。示例數據集顯示爲創建重複的開始和結束日期

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和Episode將數據集分成許多較小的部分,但我覺得應該有一個更簡單的方法來做到這一點。我剛來R,來自SAS,SAS這樣的問題不會給我太多麻煩。

如果您對我的數據準備有任何意見,我將不勝感激。

+0

我同意。您可能想要將示例數據更改爲能夠更好地表示實際數據的內容 – 2014-09-22 17:48:58

回答

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

假設您已將日期的值正確讀入日期並對待「。」像R A NA值,您的樣本數據幀應該有這樣的結構

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 

這裏我沒有覆蓋現有的結束值。我不確定在不匹配的情況下想做什麼。

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)) 
相關問題