我有一个特定客户的开始和结束周,我需要在他们订阅的几周内制作面板数据。我已经将数据操作成一个简单的形式进行转换,但是当我转置时,我没有得到开始和结束之间的几周填写。希望一个例子可以解释我的请求。周从0开始到61结束,因此为了简单起见,强迫61以上的任何一周为61。如果他们仍然订阅则填充1,否则填充空白。
ID Start_week End_week
1 6 61
2 0 46
3 45 61
我想要什么
ID week0 week1 ... week6 ... week45 week46 week47 ... week61
1 . . ... 1 ... 1 1 1 ... 1
2 1 1 ... 1 ... 1 1 0 ... 0
3 0 0 ... 0 ... 1 1 1 ... 1
答案 0 :(得分:2)
使用数组创建变量。一个问题是SAS阵列是1索引的。
data input;
input ID Start_week End_week;
datalines;
1 6 61
2 0 46
3 45 61
;
data output;
array week[62] week0-week61;
set input;
do i=1 to 62;
if i > start_week and i<= (end_week+1) then
week[i] = 1;
else
week[i] = 0;
end;
drop i;
run;
答案 1 :(得分:2)
我认为有两种方法可以做到。 我会采用数组方法,因为它可能是最快的(单个数据步骤)并且不是那么复杂:
data RESULT (drop=start_week end_week);
set YOUR_DATA;
array week_array{62} week0-week61;
do week=0 to 61;
if week between start_week and end_week then week_array[week+1]=1;
else week_array[week+1]=0;
end;
run;
或者,您可以通过每个id ::
每周创建一条记录来准备转置表data BEFORE_TRANSPOSE (drop=start_week end_week);
set YOUR_DATA;
do week=0 to 61;
if week between start_week and end_week then subscribed=1;
else subscribed=0;
output;
end;
run;
答案 2 :(得分:0)
我没有合法的语法,但是你的指南。
首先用CTE制作一个表,或者用数字0到61作为行。然后将此表与订阅表连接。像
这样的东西FROM sub
INNER JOIN CTE
ON CTE.week BETWEEN sub.Start_week AND sub.End_week
现在,客户订阅的每周都会有一行。转换那个并且你将在几周之内也填写。