我有一个带有非信息性变量名称和标签的表。但是我还有另一个表,该表的变量名称与第一个表的标签相匹配,并且标签具有参考意义。如何将第一个表中的标签更改为第二个表中的标签?
答案 0 :(得分:1)
如果表在变量方面确实是完全相同的,并且您不介意也匹配的数据集的 other 属性(格式,信息,长度,变量顺序),则可以这很容易:
data want;
if 0 then set useful_label_dataset;
set actual_dataset;
run;
这将使用有用的标签数据集来定义PDV中的列,从而输出数据集,这意味着标签,格式,长度,顺序等都将来自该数据集。 if 0
表示它实际上不会被执行,但这没关系;在SAS中,即使不执行代码,编译器也会确定这些属性。
这对于不大到无法重写表的表是一个很好的解决方案。
答案 1 :(得分:1)
要执行此操作而不重写数据集(如果数据集很大或有约束或索引,则很有用),您将需要使用PROC DATASETS
。不幸的是,这并不简单。
从一些名称不正确的标签数据开始:
data have;
attrib var1 format=best. label="Blah"
var2 format=$6. label="Super Blah";
var1 = 1;
var2 = "123456";
run;
这实际上是什么意思
data real_labels;
format old new $200.;
old="Blah";
new="Number of People";
output;
old="Super Blah";
new="Postal Code";
output;
run;
让我们获取现有的变量名称和标签:
proc contents data=have out=vars(keep=name label) noprint;
run;
将新标签加入变量名。内部联接,这样我们就不会覆盖real_labels
数据中不存在的变量的标签。
proc sql noprint;
create table label_updates as
select a.name,
b.new
from vars as a
inner join
real_labels as b
on a.label=b.old;
quit;
现在根据以上数据构建PROC DATASETS
。
data _null_;
set label_updates end=last;
if _n_ = 1 then do;
call execute("proc datasets lib=work nolist;");
call execute("modify have;");
end;
call execute("attrib " || strip(name) || " label=" || QUOTE(STRIP(NEW)) || ";");
if last then do;
call execute("run; quit;");
end;
run;