【问题标题】:SAS - Sort Multiple Dataset using loopsSAS - 使用循环对多个数据集进行排序
【发布时间】:2023-03-08 21:22:02
【问题描述】:

我有一个 SAS 数据集列表,我想按相同的变量对其进行排序。

我不想对它们中的每一个都使用 PROC Sort 语句, 有没有办法使用循环来缩短整个代码?

我是 SAS 新手,所以请帮忙!

%let prim =sasdata.qc_no_rx ;
%let other_removals = sasdata.qc_other_removals;
%let drops =sasdata.droplist;


Array data_1(3) $ sasdata.qc_no_rx sasdata.qc_other_removals 

sasdata.droplist ; 

do over data_1;
Proc sort data = data_1 ;
by ims_ref;
end;

【问题讨论】:

  • 请发布您尝试过的内容。您很可能需要使用宏,所以请解释一下您的“数据集列表”是如何存储的,它已经在 SAS 表中了吗?还是在文本文件中或在您的脑海中?还是有他们的命名约定?
  • 是的,它是 SAS 数据集(不是文本文件)的形式,我想使用 Proc 排序对所有这些数据集进行排序。我有大约 10 个数据集,所以我必须编写 10 个 Proc 排序语句(每个数据集一个)。我想用循环代替..
  • 发布您尝试过的内容或至少发布您当前的代码。
  • %let prim =sasdata.qc_no_rx ; %let other_removals = sasdata.qc_other_removals; %let 滴=sasdata.droplist;数组 data_1(3) $ sasdata.qc_no_rx sasdata.qc_other_removals sasdata.droplist ;完成data_1;过程排序数据 = data_1 ;通过 ims_ref;结束;
  • 我尝试在 do 循环中使用 proc 排序语句

标签: sas


【解决方案1】:

假设您有一个名为 dname_list 的数据集,其中包含数据集名称,它们称为 dname。 Call execute 将生成代码并执行它。

我通常在一个字符串中创建我的命令,然后将它传递给调用执行。这是一个data _null_ 步骤,因此它不会生成数据集,但如果需要,您可以首先生成数据集进行测试。

您不需要循环,因为 SAS 会自行循环遍历数据集中的记录。

如果您要对库中的数据进行排序,请确保同时包含库名称。

data _null_;
*data dname_execute;

set dname_list;
string = catt('proc sort data=', dname, '; by age; run;');
call execute(string);
run;

【讨论】:

    【解决方案2】:

    这应该会有所帮助:

    %macro multsort(indlist,outdlist,byvarlist,ndata);
    %do i = 1 %to &ndata.;
    
        %let indata = %scan("&indlist.",&i.,"   ");
        %let outdata = %scan("&outdlist.",&i.," ");
        %let byvars = %scan("&byvarlist.",&i.," ");
        proc sort data = &indata. out=&outdata.;by &byvars. ;run;
    %end;
    %mend;
    
    %multsort(indlist=sashelp.Air   sashelp.Buy,outdlist=Sa Sb,byvarlist=Air    amount,ndata=2);
    

    【讨论】:

    • 引号是干什么用的?我想你可以在 %SCAN() 函数的分隔符列表中使用引号,这样你就可以在不必使用 %STR() 的情况下获取宏代码来查看空格,但是为什么还要将它们放在名字?
    • 那是因为我将不带引号的文本传递给宏,引号最终会将 outdlist 解析为 "Sa Sb" ,如果没有引号,它将只是 Sa Sb
    • 宏代码将引号视为与任何其他字符相同。因此,如果您从空格分隔列表"Sa Sb" 中取出第一项,结果将是"Sa,而不是所需的Sa。您的代码之所以有效,是因为您还告诉 %SCAN()" 视为分隔符,并且在查找第一项时它会跳过列表开头的任何分隔符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多