SAS:通过从表中读取来更改标签

时间:2018-08-13 14:47:05

标签: sas

我有一个带有非信息性变量名称和标签的表。但是我还有另一个表,该表的变量名称与第一个表的标签相匹配,并且标签具有参考意义。如何将第一个表中的标签更改为第二个表中的标签?

2 个答案:

答案 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;