SAS崩溃日期

Tes*_*ess 1 variables sas collapse

我有一个如下所示的数据集:

cust date 1 2 3... 600
1    1    5 . . ... .
1    2    5 . . ... .
1    2    . 4 . ... .
1    2    . . 6 ... .
2    1    1 . . ... .
2    1    . 5 . ... .
2    2    . . . ... 10
Run Code Online (Sandbox Code Playgroud)

我想按客户(cust)为每个日期折叠变量1到600,以便数据集如下所示:

cust date 1 2 3... 600
1    1    5 . . ... .
1    2    5 4 6 ... .
2    1    1 5 . ... .
2    2    . . . ... 10
Run Code Online (Sandbox Code Playgroud)

我从以下代码开始(可能它有点复杂),它不起作用:

data want ;
set have;
array vars &list.; *stored array of variables 1-600;
retain count vars;
by cust date;
if first.date then do;
do _i=1 to dim(vars);
vars[_i]=.; 
end;
count=0;
end;
count=count+1;
vars[_1]=vars;
if last.date then do;
output;
end;
drop count;
run;
Run Code Online (Sandbox Code Playgroud)

你有什么主意吗?另一个想法是使用proc expand,但它不起作用,因为日期是重复的.

非常感谢你的帮助!!

Lon*_*ish 7

使用UPDATE语句实现这一点有一个巧妙的技巧.对现有表的第一个引用(obs = 0)创建一个具有所需结构的空表,第二个引用随值更新.BY语句确保它只为每个BY值输出一条记录.希望这是有道理的.

data have;
input cust date v1 v2 v3 v600;
datalines;
1    1    5 . . .
1    2    5 . . .
1    2    . 4 . .
1    2    . . 6 .
2    1    1 . . .
2    1    . 5 . .
2    2    . . . 10
;
run;

data want;
update have (obs=0) have;
by cust date;
run;
Run Code Online (Sandbox Code Playgroud)