楼主: pksb
6610 1

[SAS] 【翻译】怎样将一个SAS数据集拆分成多个 [推广有奖]

  • 4关注
  • 1粉丝

本科生

40%

还不是VIP/贵宾

-

威望
0
论坛币
2902 个
通用积分
0
学术水平
1 点
热心指数
1 点
信用等级
0 点
经验
1912 点
帖子
6
精华
0
在线时间
180 小时
注册时间
2010-3-13
最后登录
2022-5-2

楼主
pksb 发表于 2015-2-13 15:54:52 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

源代码+补充说明+参考



      SAS程序员会经常需要把一个数据集分成几个小的数据集。这是一件很容易就能做到的事情,用where= 选项或者FIRSTOBS=/OBS= 的组合既可以。

      但是拆分数据集产生了多个文件这意味着占用了更多的硬盘空间,使用了更多的IO操作。而IO操作和硬盘资源的访问对SAS来说是最昂贵的开销。

1、源代码






      但是如果你的领导分配你这个任务,你肯定也不会在上面花多少心思。

      现在我们假设你需要按照数据集的某列的值来拆分这个数据集。

      你肯定会这么写,例子如下:

  1. DATA out_Asia;
  2. set sashelp.cars(where=(origin='Asia'));
  3. run;
  4. DATA out_Europe;
  5. set sashelp.cars(where=(origin='Europe'));
  6. run;
  7. DATA out_USA;
  8. set sashelp.cars(where=(origin='USA'));
  9. run;
复制代码


我(原文作者)得承认,现在这不是最有效率或者最优雅的方法。不过这是SAS新手们最容易想到的方法。


情况一


      上面这段代码是比较简单的,尤其是只有3个不同的值。但是如果用于区分的值有很多这样就需要考虑很多的情况非常容易出错。
      这个时候我通常就会使用PROC SQL和SELECT INTO 把值赋给一个宏变量。举个简单的例子:


  1. proc sql;
  2. select distinct ORIGIN into :valList separated by ',' from SASHELP.CARS;
  3. quit;
复制代码

      这段代码创建了一个宏变量VALLIST,并且将所有ORIGIN用逗号区分赋值给它。

情况二

      但是我们可以用SAS函数改善输出,增加其他的代码把值织入到代码逻辑中去。举个例子,我们可以用CAT函数来连接查询来的值和SAS关键字。得出的结果是纯SAS代码可以直接在宏代码中被引用或者执行。我将共享我最终的代码,并且将代码分成几部分便于读者理解。


  1. /* define which libname.member table, and by which column */
  2. %let TABLE=sashelp.cars;
  3. %let COLUMN=origin;

  4. proc sql noprint;
  5. /* build a mini program for each value */
  6. /* create a table with valid chars from data value */
  7. select distinct
  8.    cat("DATA out_",compress(&COLUMN.,,'kad'),
  9.    "; set &TABLE.(where=(&COLUMN.='", &COLUMN.,
  10.    "')); run;") into :allsteps separated by ';'
  11.   from &TABLE.;
  12. quit;

  13. /* macro that includes the program we just generated */
  14. %macro runSteps;
  15. &allsteps.;
  16. %mend;

  17. /* and...run the macro when ready */
  18. %runSteps;
复制代码


2、补充说明



下面是对PROC SQL部分的一些说明:



  • SELECT DISTINCT 保证了变量的每个值都只有一条记录。
  • CAT函数把一系列字符串进行了连接(注意到CAT函数有一些变异函数比如CATX,CATS,CATT等,这些函数会将字符串的空白部分去掉)​。在这个例子中我想保留所有在数据中出现的空白部分,因为我们要做相等判断。
  • 程序使用每个值作为输出数据集名称的后缀("OUT_datavalue")。SAS数据集名称只能包含字母和数字,所以这里我使用compress函数删掉所有的空格。kad选项表示值保留英文字母和数字。
  • 所有的程序语句最后赋值给了allsteps这个宏变量,我只需要在SAS程序中引用这段代码就可以运行它了。我选择了另外一种方式,将代码包在了宏里面。这样便于控制这段可执行代码的作用域和位置。


​“By each value of a variable​”仅仅只是拆分数据集的一种条件。我遇到过其他许多拆分数据集的规则:



  • ​​通过观测的数目,比如将一个300万条观测的数据集拆分成3个100万的
  • 通过排名或者百分数
  • 通过日期拆分





3、参考



有些版本不认空格 需要加"";

来源于SAS博客列表。












二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:SAS数据集拆分 sas数据集 数据集 generated proc sql 源代码 程序员 where 空间 资源

已有 1 人评分经验 论坛币 收起 理由
niuniuyiwan + 60 + 60 精彩帖子

总评分: 经验 + 60  论坛币 + 60   查看全部评分

沙发
niuniuyiwan 在职认证  发表于 2015-8-11 07:13:42
好帖,感谢分享

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-28 17:00