例如:
data work.code;
input code_num $9. qty ;
datalines;
123456789 49
123456789 384
123456789 37
123456789 485
123456780 34
123456780 567
123456780 23
123456780 543
123456788 21
123456788 876
123456788 54
123456788 987
;
run;
我想根据code_num变量将此数据集分解为多个数据集:
data code_num_1
123456789 49
123456789 384
123456789 37
123456789 485
data code_num_2
123456780 34
123456780 567
123456780 23
123456780 543
等。代码的数量将在未来变化。
我尝试应用call execute函数,但无法通过它传递数字…也许是do循环?
根据sasrd的答案,您可以使用散列表:
https://sasnrd.com/sas-split-dataset-by-group/
data _null_;
if(_N_ = 1) then do;
if(0) then set code;
dcl hash h(dataset:"code(obs=0)", multidata:'Y');
h.definekey(all:'Y');
h.definedata(all:'Y');
h.definedone();
end;
do until(last.code_num);
set code;
by code_num;
h.add();
end;
id+1;
out = cats('code_num_', id);
h.output(dataset:out);
h.clear();
run;
唯一的区别是我们为每个数据集名称创建了一个唯一的ID,而不是使用by-group。确保code_num
按照某种逻辑顺序排序。您可以先使用proc sort
或notsorted
选项,如果它总是按正确的顺序。
不需要拆分数据集来处理部分数据。只需使用WHERE语句。
proc surveyselect data=code ..... ;
where code_num = "123456789";
...
run;
如果数据是排序的(或索引的),你可以经常使用BY语句来单独处理每一组。
proc surveyselect data=code ..... ;
by code_num ;
...
run;