【问题标题】:SAS: How to split data into subsets with names in sequence.SAS:如何将数据拆分为按顺序命名的子集。
【发布时间】:2015-12-23 01:28:20
【问题描述】:

我正在使用 SAS 将数据集拆分为具有以下命名约定的子集:sub001、sub002、sub003 .... 我的数据集看起来像

ID   var1
AA   ...
AA   ...
AB   ...
AC   ...
...  ...
AZ   ...
...  ...
ZZ   ...

我可以手动完成。

data sub001 sub002.....sub676;
set data;
if id='AA' then output sub001;
.....
if id='ZZ' then output sub676;
run;

但是有什么简单的方法可以做到这一点吗?我认为%macro%do 可以在这里提供帮助。

【问题讨论】:

  • 请展示您尝试过的内容。另外,您确定要这样做吗?通常像这样拆分数据是一种低效的解决方案。如果您描述了为什么要拆分数据,人们可能会给您更好的选择。
  • ID 的每个值都成为自己的子集吗?如果是这样,为什么不在以后的分析中使用 BY ID 语句而不是制作许多小数据集?

标签: sas subset


【解决方案1】:

如果您希望将它们全部拆分为一组数据集,您可以使用宏来执行此操作。这是我在宏编程中最喜欢的小技巧之一:

第 1 步:将所有不同的 ID 读入以空格分隔的宏变量

proc sql noprint;
    select distinct strip(upcase(id) )
    into :all_ids separated by ' '
    from have;
quit;

第 2 步:循环遍历 &all_ids 中的所有单词,根据 &all_ids 的每个值过滤 have

options nonotes;

%macro split;
    %do i = 1 %to %sysfunc(countw(&all_ids) );
        data sub_&i;
            set have;
            where upcase(ID) = "%scan(&all_ids, &i)";
        run;
    %end;
%mend;
%split;

options notes;

因为我们循环的是空格分隔的宏变量&all_ids中的单词总数,所以&i的值和每个单词在&all_ids中的位置是一一对应的。例如:

 &i  |        &all_ids      
LOOP   WORD NUMBER      WORD           
 1         1             AA
 2         2             AB
 3         3             AC

这不是最有效的方法,因为我们每次都将新数据集写入磁盘,但除非您的资源极其有限,或者您拥有数百 GB 或更多的庞大数据集,它应该很快完成。如果您需要一种减少 I/O 的方法,我也可以为您提供帮助。

【讨论】:

    猜你喜欢
    • 2014-02-21
    • 2020-01-31
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多