跨项目标准化数据集属性
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
数据集中,将属性应用到这些变量存在的地方的最佳方法是什么?
我会将输出数据集写入新的 libnames,例如: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 偷来的)
您应该能够进行修改以满足您的其余要求(复制到新库、遍历项目)。
背景:
我有多个旧项目需要标准化 (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
数据集中,将属性应用到这些变量存在的地方的最佳方法是什么?
我会将输出数据集写入新的 libnames,例如: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 偷来的)
您应该能够进行修改以满足您的其余要求(复制到新库、遍历项目)。