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,但它不起作用,因为日期是重复的.
非常感谢你的帮助!!
使用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)