我打算研究空气污染对急诊室就诊的影响,我打算采用双侧病例交叉设计。对于每个病例(医院就诊),我想创建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
答案 0 :(得分: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;
答案 1 :(得分: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 :(得分: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))