示例:
我需要对由3个数据集合并在一起的数据集中的变量进行重新排序。
Dataset1: test_1 test_2 test_3 test_4... test_n
Dataset2: plu_1 plu_2 plu_3 plu_4... plu_n
Dataset3: set_1 set_2 set_3 set_4... set_n
我需要一个数据集,其变量重新排序到此:test1 plu1 set1 test2 plu2 set2...test_n plu_n set_n
我有几百个变量,因此手动编写例如保留声明不会这样做。
答案 0 :(得分:1)
没有样本数据集,但您可以尝试这种方式: 1.通过proc内容获取数据集的变量; 2.排序名称; 3.设置合并的虚拟变量; 4.将变量序列保存到宏变量中; 5.合并你的三个数据集,在合并之前保留。
%macro varslist(dsn);
proc contents data=&dsn out=&dsn._&dsn(keep=name);
proc sort data=&dsn._&dsn;
by name;
data &dsn._&dsn;
set &dsn._&dsn;
rename name=name_&dsn;
dummy=_n_;
run;
%mend;
%varslist(dataset1)
%varslist(dataset2)
%varslist(dataset3)
data _null_;
merge dataset1_dataset1 dataset2_dataset2 dataset3_dataset3 end=last;
by dummy;
length list $2000.;
retain list;
list=catx(' ',list,of name:);
if last then call symputx('namelist',list);
run;
data want;
retain &namelist;
merge dataset1 dataset2 dataset3;
by var;
run;
答案 1 :(得分:1)
我的解决方案假设所有3个数据集具有相同的列数,顺序相同(我不知道您是否有要合并的id列,如果是,那么代码需要稍微调整一下)。
我利用元数据表until
(dictionary.columns
是此视图),它存储每个列在任何给定数据集中的位置。例如。 test_1,plu_1,set_1将全部包含位置1,test_2,plu_2,set_2位置2等。因此,您可以从所有3个数据集中提取名称和位置,然后按位置排序,为您提供合并数据集所需的顺序。然后,将这些名称存储在宏列表中的简单问题就是在sashelp.vcolumn
语句之前的retain
语句中使用。
代码如下。我最初在第一个sql块中包含了一个merge
语句,但奇怪的是它并没有对数据进行一致排序(它强调了order by
没有按顺序读取数据的事实,不像数据步骤)。省略proc sql
并添加后续order by
解决了问题。
proc sort
答案 2 :(得分:0)
要交错这样的3个变量列表而不用硬编码生成首选重新排序语句所需的任何内容(我更喜欢informat
而不是retain
因为它会导致更少的数据更改步骤行为)通过宏或使用调用执行的数据步骤。
请注意,此网站不是代码点播服务,因此请自行执行此操作,如果您对其中的某个部分有任何问题,请回复此处。
答案 3 :(得分:0)
对于一次性交易,您可以知道自己的数量是多少?三胞胎"这是快速而简单的:
%macro MERGEM(VARCOUNT=30);
data OUT ;
retain KEY
%do I=1 %to &VARCOUNT;
test_&I plu_&I set_&I
%end; ;
merge DATASET1
DATASET2
DATASET3 ;
by KEY ;
run;
%mend MERGEM;
%MERGEM(VARCOUNT=30);
(不要忘记第二个&#34 ;;"在%end之后......第一个关闭%do循环,第二个关闭retain语句。)