sas set中使用keep=会影响原数据集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sas set中使用keep=会影响原数据集相关的知识,希望对你有一定的参考价值。

参考技术A 不会,只对目标数据集有影响

SAS set 语句使用冒号并创建文件名变量

【中文标题】SAS set 语句使用冒号并创建文件名变量【英文标题】:SAS set statement using colon and creating a filename variable 【发布时间】:2017-07-06 21:18:40 【问题描述】:

所以使用 SAS,我有一些 SAS 月末数据集,命名如下:

mydata_201501
mydata_201602
mydata_201603
mydata_201604
mydata_201605
...
mydata_201612

每个人都有特定月末的帐户信息。我想使用冒号将数据集全部堆叠到一个数据集中,而不是写出完整的集合语句,如下所示:

data mynewdata;
set mydata_:;
run;

但是,数据集中没有 datestamp 变量,因此当我将它们堆叠起来时,我会丢失每个帐户的月末信息。我想知道哪一行是指每个帐户的哪个月末。有没有一种方法可以自动创建一个变量来命名该行来自的表。例如,冗长的方式是这样的:

data mynewdata;
set mydata_201501 (in=a) mydata_201502 (in=b) mydata_201503 (in=c)...;
if a then tablename = 'mydata_201501';
if b then tablename = 'mydata_201502';
if c...
run;

但是有没有更快的方法使用冒号?

data mynewdata;
set mydata_:;
tablename = _tablelabel_;
run;

谢谢

【问题讨论】:

看来这就是你要找的东西:support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/… 【参考方案1】:

我总是觉得点击评论链接很烦人,所以希望这就是您的上下文中的答案。使用INDSNAME= SET 语句选项将数据集名称分配给变量:

data mynewdata;
  set mydata_: indsname=_tablelabel_;
  tablename = _tablelabel_;
run;

注意您可以随意调用_tablelabel_,并且您可能希望对其进行更改,使其看起来不像 SAS 生成的变量名。

INDSNAME= 仅在 9.2 版中成为 SAS SET 语句选项

【讨论】:

这太棒了 - 一个完美的解决方案。非常感谢。【参考方案2】:

为了清楚起见,在我的特定代码中,数据集被命名为 mydata_yyyymm 并且我想要一个带有日期戳的月末变量,我能够使用 mjsqu 提供的解决方案来生成它,如下所示(obs 并在需要时提供声明):

data mynewdata;
  set mydata_: (obs=100 keep=xxx xxx) indsname=_tablelabel_;
  format monthend yymmdd10.;
  monthend = input(scan(_tablelabel_,-1,'_'),yymmn6.);
run;

【讨论】:

以上是关于sas set中使用keep=会影响原数据集的主要内容,如果未能解决你的问题,请参考以下文章

SAS编程基础 - 数据获取与数据集操作

什么对 SAS 数据集性能的影响更大 - 观察数或变量数?

sas,combine,未知代码数据集观察

SAS 对数据集所有字段rename

SAS 对数据的拼接与串接

SAS 统计某个数据集各个字段频数,并汇集到一个表中