我正在研究多种调查数据。我已经为第一波数据定义了格式和标签。
第二波数据将有所不同,但代码,标签,格式和变量名称都是相同的。我不想再次定义所有这些属性......似乎应该有一种方法可以导出一个数据集的PROC CONTENTS信息并将其导入另一个数据集。有没有办法做到这一点?
我发现的最接近的东西是PROC CPORT,但我对它完全感到困惑,无法让它运行。
(为了清楚我也会以另一种方式提出这个问题......)
当您运行PROC CONTENTS时,SAS会告诉您它为数据集中的每个变量使用的格式,标签等。
我有第二个数据集,其中包含完全相同的变量名称。我想使用第一个数据集中的变量属性来处理第二个数据集中的变量。有没有办法做到这一点?
谢谢!
答案 0 :(得分:1)
因此,您有一个MODEL数据集和一个HAVE数据集,两者都包含数据。您希望创建具有HAVE数据的WANT数据集,其中包含MODEL(格式,标签和变量长度)的属性。你可以这样做:
data WANT ;
if 0 then set MODEL ;
set HAVE ;
run ;
这是有效的,因为当DATA步骤编译时,SAS构建定义变量属性的程序数据向量(PDV)。即使SET MODEL永远不会执行(因为0不是真的),当步骤编译时,MODEL中的所有变量都会在PDV中创建。
重要的是,请注意,如果有相应的变量具有不同的长度,则MODEL的长度将决定WANT中变量的长度。因此,如果HAVE的变量比MODEL中的同名变量长,则可能会被截断。选项VARLENCHK确定如果发生这种情况,SAS是否会抛出警告/错误。
假设HAVE数据集上没有格式/标签。如果HAVE中的变量具有格式/标签,并且MODEL中的相应变量没有格式/标签,则HAVE中的格式/标签将应用于WANT。
以下示例代码。
data model;
set sashelp.class;
length FavoriteColor $3;
FavoriteColor="Red";
dob=today();
label
dob='BirthDate'
;
format
dob mmddyy10.
;
run;
data have;
set sashelp.class;
length FavoriteColor $10;
dob=today()-1;
FavoriteColor="Orange";
label
Name="HaveLabel"
dob="HaveLabel"
;
format
Name $1.
dob comma.
;
run;
options varlenchk=warn;
data want;
if 0 then set model;
set have;
run;
答案 1 :(得分:1)
我将基于现有数据集创建一个空数据集,然后使用proc append将内容附加到其中。
为第二轮数据创建一些示例数据:
data new_data;
age = 10;
run;
根据原始数据创建一个空数据集:
proc sql noprint;
create table want like sashelp.class;
quit;
将数据附加到空数据集中,保留原始数据的详细信息:
proc append base=want data=new_data force nowarn;
run;
请注意,我已使用force
上的nowarn
和proc append
选项。即使在使用的两个数据集之间发现差异,这也将确保附加数据。例如,如果您有格式差异,则可以预期这种情况。它还会隐藏一些内容,比如新表中存在的列是否存在于旧表中等等。所以要小心,这样做是你想做的。如果行为是不合需要的,请考虑使用datastep来代替(并首先列出want
数据集)。
答案 2 :(得分:0)
欢迎来到堆栈。
如果要复制表中没有数据的属性,可以使用PROC SQL或读入零行的数据步骤。
此示例将有关SASHELP.CLASS数据集的所有信息复制到全新的数据集中。所有格式,属性,标签,整个东西都是副本。如果只想复制某些列,请在select子句而不是asterix中指定它们。
PROC SQL outobs=0;
CREATE TABLE WANT as SELECT * FROM SASHELP.CLASS;
QUIT;
此致 瓦西里