专栏首页老Z的博客批量改变SAS数据集字符型变量的长度

批量改变SAS数据集字符型变量的长度

临床试验的SAS程序猿/媛都知道,FDA对所提交的数据集的大小是有限定的,因为数据集过大在操作时会有点麻烦(比如打开会很慢),所以当我们生成最终的数据集时就要进行一个操作:按照字符型变量值的最大长度来重新定义变量的长度,以删除多余的空格从而减少数据集的大小。下面贴上我去年写的实现这一目的的宏程序:

%macro relngth(slib=, mem=);
proc sql noprint;
    select cats(n(NAME)) into :vnum
        from dictionary.columns
        where LIBNAME=upcase("&slib") and MEMNAME=upcase("&mem") and  TYPE='char'
        order VARNUM
        ;

    select cats(NAME) into :var1 -:var&vnum
        from dictionary.columns
        where LIBNAME=upcase("&slib") and MEMNAME=upcase("&mem") and  TYPE='char'
        order VARNUM
        ;

    select %do i=1 %to %eval(&vnum-1); "&&var&i"||' char('||cats(max(lengthn(&&var&i)))||'), '|| %end;
                                       "&&var&vnum"||' char('||cats(max(lengthn(&&var&i)))||')'
        into :modlst
        from &slib..&mem
        ;

    alter table &slib..&mem
        modify &modlst
        ;
quit;
%mend relngth;

/*SDTM数据集所在的逻辑库名字*/
%let slib=TRANSFER;

options NOQUOTELENMAX;

data _null_;
    set sashelp.vtable(where=(LIBNAME="&slib"));
    call execute('%nrstr(%relngth(slib=&slib, mem='||cats(MEMNAME)||'))');
run;

注意,上面的程序中我并没有直接用METADATA中的DATADEF这个数据集,而是用了视图SASHELP.VTABLE,这是为了说明另一个问题:SASHELP.VTABLE虽然可以直接在DATA步中使用,但是不建议使用,因为在我们使用这个视图时SAS后台执行视图的操作并没有优化,而且在LOG中有可能看到类似下面的CEDA信息:

INFO: Data file libref.member.DATA is in a format native to another host or the file encoding does not match the session encoding. Cross Environment Data Access will be used, which may require additional CPU resources and reduce performance.

这些都会大大的影响程序运行效率,故建议使用数据字典,原因在SAS在线文档中有说明,搬运如下:

When querying a DICTIONARY table, SAS launches a discovery process that gathers information that is pertinent to that table. Depending on the DICTIONARY table that is being queried, this discovery process can search libraries, open tables, and execute views. Unlike other SAS procedures and the DATA step, PROC SQL can mitigate this process by optimizing the query before the discovery process is launched. Therefore, although it is possible to access DICTIONARY table information with SAS procedures or the DATA step by using the SASHELP views, it is often more efficient to use PROC SQL instead.

程序如下:

/*SDTM数据集所在的逻辑库名字*/
%let slib=TRANSFER;

options NOQUOTELENMAX;

proc sql;
    create table datadef as
        select MEMNAME
        from dictionary.tables
        where LIBNAME=upcase("&slib")
        ;
quit;

data _null_;
    set datadef;
    call execute('%nrstr(%relngth(slib=&slib, mem='||cats(MEMNAME)||'))');
run;

当然还可以使用PROC CONTENTS或者FILENAME PIPE方法来得到数据集DATADEF,程序如下:

/*PROC CONTENTS*/
ods output members=datadef;

proc contents data=&mlib.._all_ memtype=data;
run;

/*数据集变量列表
proc contents data=&mlib..cd out=varlist;
run;
*/

/*FILENAME PIPE*/
filename raw pipe "ls &_meta.*.sas7bdat | sed 's/.*\/\(.*\)\.sas7bdat/\1/'"; 
/*结果为单行的命令:"echo `ls &_meta.*.sas7bdat | sed 's/.*\/\(.*\)\.sas7bdat/\1/'`"*/

data datadef;
    infile raw;
    input;
    length DATASET $8;
    DATASET=upcase(cats(_INFILE_));
run;

filename raw clear;

不过还是直接使用METADATA中的DATADEF这个数据集最方便了,程序如下:

/*SDTM数据集所在的逻辑库名字*/
%let slib=TRANSFER;

/*METADATA所在的逻辑库名字*/
%let mlib=META;

options NOQUOTELENMAX;

data _null_;
    set &mlib..datadef(keep=DATASET);
    call execute('%nrstr(%relngth(slib=&slib, mem='||cats(DATASET)||'))');
run;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Annotate Facility之生存曲线

    在研究肿瘤的临床实验中,通常要进行生存分析。其中最重要的分析方法之一就是乘积极限法(product-limit),简称积限法或PL法,它是由统计学家Kaplan...

    专业余码农
  • 一个关于SAS转置的问题

    PROC TRANSPOSE是SAS中用来对数据集进行行列转置的过程步,有时候可能需要经过多次PROC TRANSPOSE才能得到我们想的结果。今天无意中看到一...

    专业余码农
  • 正则表达式之贪婪匹配 VS 非贪婪匹配

    我们知道,许多程序设计语言都支持利用功能强大的正则表达式进行字符串操作,SAS中也有用正则表达式的PRX Function,平时在写正则表达式的时候会常碰到贪婪...

    专业余码农
  • Mac怎么用, 写在升级Mojave前

    sean_yang
  • MeanShift算法C++解析(三)

    最后是最重要的核心啦,就是MeanShift_Tracking这个函数。同样的,我们先来看看这个函数的内部变量。

    钱塘小甲子
  • Android Studio 3.0 实现 WIFI 真机调试 / AS 3.0 实现无线真机调试

        目前可选插件有多款,但问题是升级 AS 到 3.0 后,好几款都不能连接到手机,以下推荐这款是笔者新配置的,完全可用么得问题,运行速度给力!

    码脑
  • istio 常见异常分析

    istio 支持多平台,不过 Istio 和 k8s 的兼容性是最优的,不管是设计理念,核心团队还是社区, 都有一脉相承的意思。但 istio 和 k8s 的适...

    钟华
  • LevelDB 代码撸起来!

    LevelDB 的大致原理已经讲完了,本节我们要亲自使用 Java 语言第三方库 leveldbjni 来实践一下 LevelDB 的各种特性。这个库使用了 J...

    老钱
  • Percona XtraDB Cluster添加仲裁节点

    Galera Arbitrator是Percona XtraDB集群的成员,用于投票,以防您拥有少量服务器(通常为两个)并且不希望添加更多资源。Galera仲裁...

    Leshami
  • 在连续或大型离散行动空间中进行规划的边际工具(CS AI)

    基于样本的计划是一种功能强大的算法系列,可以根据环境模型生成智能行为。产生良好的候选动作对于基于样本的计划者的成功至关重要,特别是在连续或大型动作空间中。通常,...

    刘子蔚

扫码关注云+社区

领取腾讯云代金券