合并时如何以特定顺序对Sas数据集中的变量进行重新排序?

时间:2015-06-22 12:37:28

标签: sas

示例:

我需要对由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

我有几百个变量,因此手动编写例如保留声明不会这样做。

4 个答案:

答案 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列,如果是,那么代码需要稍微调整一下)。

我利用元数据表untildictionary.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语句。)