2012-09-10 19 views
3

我打算研究空氣污染對急診室訪問的影響,我打算使用雙邊病例交叉設計。對於每個病例(醫院訪問),我想創建4個對照日期(訪問前後7和14天)。例如,如果一個人在2012年9月10日訪問一家診所,我的控件將爲8月27日,9月03日,9月17日和9月24日。以下示例說明了我擁有的以及我想實現的目標。在雙邊病例交叉設計中創建控制日期

如何在SAS,Stata的承接這或R將高度讚賞

樣本數據中的任何想法(都是訪問日期)

id date 
------------- 
1 04-jan-05 
2 05-jan-05 
3 05-jan-05 
4 06-jan-05 
5 06-feb-05 

我想什麼來實現(每id有一個case和4個控件)

id date  outcome 
--------------------------- 
1 21-Dec-04 control 
1 28-Dec-04 control 
1 04-Jan-05 case 
1 11-Jan-05 control 
1 18-Jan-05 control 
2 22-Dec-04 control 
2 29-Dec-04 control 
2 05-Jan-05 case 
2 12-Jan-05 control 
2 19-Jan-05 control 
3 22-Dec-04 control 
3 29-Dec-04 control 
3 05-Jan-05 case 
3 12-Jan-05 control 
3 19-Jan-05 control 
4 23-Dec-04 control 
4 30-Dec-04 control 
4 06-Jan-05 case 
4 13-Jan-05 control 
4 20-Jan-05 control 
5 23-Jan-05 control 
5 30-Jan-05 control 
5 06-Feb-05 case 
5 13-Feb-05 control 
5 20-Feb-05 control 
+0

封裝['season'](http://cran.r-project.org/web/packages/season/index.html)具有的功能與使用整個套件'R' – mnel

回答

3

一個簡單的循環會產生你想要的輸出。

data have; 
input id date :date10.; 
format date date9.; 
datalines; 
1 04-jan-05 
2 05-jan-05 
3 05-jan-05 
4 06-jan-05 
5 06-feb-05 
; 
run; 

data want (drop=i date rename=(date1=date)); 
set have; 
format date1 date9.; 
length outcome $8; 
do i=-14 to 14 by 7; 
    date1=date+i; 
    outcome=ifc(i=0,'case','control'); 
    output; 
end; 
run; 
2

這裏是一個R解決方案:

# Your data 
visits <- read.table(header=TRUE, text = "id date 
1 04-jan-05 
2 05-jan-05 
3 05-jan-05 
4 06-jan-05 
5 06-feb-05") 

# Convert $date to a date format 
visits$date <- as.Date(visits$date, format="%d-%b-%y") 

爲了得到一個列表你的輸出(這可能會在某些情況下是有用的):

lapply(1:nrow(visits), 
     function(x) 
     data.frame(id = visits$id[x], 
        dates = visits$date[x] + seq(-14, 14, 7), 
        outcome = c("control", "control", "case", 
           "control", "control"))) 

或者,如果你喜歡單個data.frame,相同,加上一個do.call(rbind, ...)

do.call(rbind, 
     lapply(1:nrow(visits), 
       function(x) 
       data.frame(id = visits$id[x], 
          dates = visits$date[x] + seq(-14, 14, 7), 
          outcome = c("control", "control", "case", 
             "control", "control")))) 
2

Stata的溶液:

input byte id str9 sdate 
    1 04-jan-05 
    2 05-jan-05 
    3 05-jan-05 
    4 06-jan-05 
    5 06-feb-05 
end 
generate long ndate = date(sdate,"DMY",2050) 
expand 5 
bysort id: replace ndate = ndate + (_n-3)*7 
generate byte case = (ndate == date(sdate,"DMY",2050)) 
+0

這看起來應該可以工作,但我得到的日期類似'16426'。我只在Stata 11上測試過。 – A5C1D2H2I1M1N2O1R2T1

+0

好的。通過在你的命令中加入'format ndate%td',我可以得到更好的讀者友好輸出。 – A5C1D2H2I1M1N2O1R2T1

+0

這是Stata中的Unix日期。見'幫助日期'。 – StasK