跨项目标准化数据集属性

Standardising dataset attributes across projects

背景:

我有多个旧项目需要标准化 (PRJ01-PRJ10)。每个都存储在自己的库名下,每个都有大约 30 个数据集(注意:并非所有研究都有相同的 30 个数据集)。

变量名称在项目中保持一致。然而,多年来,分配给这些变量名称的标签和格式在某些地方发生了变化——例如:

Attribute inconsistencies BETWEEN studies:

data PRJ01.users(label='user identifiers') ;
  attrib USERID label='Username' format=. ;
run ;

data PRJ02.users(label='User Identifiers') ;
  attrib USERID label='Name of user' format=. ;
run;

Attribute inconsistencies WITHIN studies:

data PRJ02.users(label='User Identifiers') ;
  attrib USERID label='Name of user' format=. ;
run; 

data PRJ02.orders(label='Orders') ;
  attrib USERID  label='Name of User' format=.) 
         ORDERNO label='Order number' format=8. ;
run ;

我写了一个程序来报告所有的不一致。但是,我需要生成所有项目的 'tidy' 副本,为它们提供标准化结构。我目前的想法是,我应该创建一个标准变量数据集,如下所示,我们可以添加和调整,直到我们在那里定义了所有内容:

data standards ;
  attrib USERID  label='Username                                ' format=. 
         ORDERNO label='Order Number                            ' format=8.
;run ;

问题:

从这个 standards 数据集中,将属性应用到这些变量存在的地方的最佳方法是什么?

我会将输出数据集写入新的 l​​ibnames,例如:PRJ01.users --> PRJSTD01.users 并将错误记录到日志中,如果有任何变量在变量长度被截断的地方被更改.

创建包含您的标准的词典table:

name     label         format
USERID   Username      .
ORDERNO  Order Number  8.

加入字典 table,其中包含您库中的列名:

proc sql;
create table standards2 as
select
  d.memname,
  s.name,
  s.label,
  s.format
from
  sashelp.vcolumn d
  inner join standards s
  on d.name = s.name
where
  libname eq 'PRJ01'
order by
  d.memname,
  s.name
;
quit;

得到这个:

memname    name     label         format
users      USERID   Username      .
orders     USERID   Username      .
orders     ORDERNO  Order Number  8.

然后使用 put 语句读取此数据集以创建执行修改的 proc datasets

filename gencode temp;
data _null_;
  set standards2 end=eof;
  by memname;
  file gencode;
  if _n_ = 1 then put       "proc datasets lib=PRJ01 nolist;";
  if first.memname then put "  modify " memname ";";
  put                       "  label " name "='" label "';";
  put                       "  format " name format ";";
  if eof then put           "quit;";
run;
%include gencode / source2;
filename gencode clear;

(从 this paper 偷来的)

您应该能够进行修改以满足您的其余要求(复制到新库、遍历项目)。