3

我计划研究空气污染对急诊室就诊的影响,并打算使用双边病例交叉设计。对于每个案例(医院就诊),我想创建 4 个对照日期(就诊前后的 7 天和 14 天)。例如,如果一个人在 2012 年 9 月 10 日访问诊所,我的控制将是 8 月 27 日、9 月 3 日、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都有一个案例和 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
4

3 回答 3

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;
于 2012-09-10T11:46:32.707 回答
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"))))
于 2012-09-10T12:28:58.150 回答
2

状态解决方案:

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))
于 2012-09-11T03:06:18.973 回答