全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 经管代码库
6611 1
2015-02-13

源代码+补充说明+参考



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

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

1、源代码






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

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

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

复制代码


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


情况一


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


复制代码

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

情况二

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


复制代码


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博客列表。












二维码

扫码加我 拉你入群

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

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

全部回复
2015-8-11 07:13:42
好帖,感谢分享
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群