SAS-将原始表名称作为列添加到报告中
我有一个输出表,其中包含30个不同表中的300多个变量,这些表由UNION连接,用于建模。我创建了一个宏,该宏使用此输出表创建了一个包含大量统计信息的报告,例如平均值、最小值/最大值等。我试图在报告中添加一列,详细说明变量来自哪个表。我说表是因为一些变量在不同的表中共享。我希望避免在报告中多次使用相同的变量,因为无论变量来自哪个表,统计数据都是相同的。有没有一种有效的方法可以做到这一点?如果是我,我会循环遍历每个SAS-将原始表名称作为列添加到报告中,sas,report,Sas,Report,我有一个输出表,其中包含30个不同表中的300多个变量,这些表由UNION连接,用于建模。我创建了一个宏,该宏使用此输出表创建了一个包含大量统计信息的报告,例如平均值、最小值/最大值等。我试图在报告中添加一列,详细说明变量来自哪个表。我说表是因为一些变量在不同的表中共享。我希望避免在报告中多次使用相同的变量,因为无论变量来自哪个表,统计数据都是相同的。有没有一种有效的方法可以做到这一点?如果是我,我会循环遍历每个union数据集,然后将表名和变量名放入编译后的数据集中。您可能在宏列表中或键入了所
union
数据集,然后将表名和变量名放入编译后的数据集中。您可能在宏列表中或键入了所有表名,因此您只需再添加几行代码,在每行上运行proc contents
,即可编译表名和变量名的完整列表。请注意,与您的示例一样,在编译表后,您可以修改重复的变量名:
** create different tables **;
data height; set sashelp.class(keep=name height); run;
data weight; set sashelp.class(keep=name weight); run;
data sex; set sashelp.class(keep=name sex); run;
** put your datasets into a list either manually or dynamically **;
/* manually */
%let ds_list=height weight sex;
/* dynamically -- be careful to include only tables in your union */
proc sql noprint;
select MEMNAME
into: ds_list separated by " "
from sashelp.vmember
where libname = "WORK" and memname not in ("SASMACR","FORMATS");
quit;
%put &ds_list.;
** loop over each table to put the table name and variables in a dataset **;
%MACRO get_names(ds_list);
%do i=1 %to %sysfunc(countw(&ds_list.));
%let ds = %scan(&ds_list.,&i.);
proc contents data = &ds. noprint
out=names_&ds.(keep=MEMNAME NAME rename=(MEMNAME=SOURCE_DATASET));
run;
proc append data = names_&ds. base=full force; run;
%end;
%MEND;
%get_names(&ds_list.);
而不是联合考虑使用一个数据步骤,然后使用<代码> IdSnord< /Cord>选项。
data want;
set sashelp.class sashelp.cars indsname=source;
source_dataset = source;
run;
我通过以下方法成功地做到了这一点: 使用源表创建表
PROC SQL;
CREATE TABLE SOURCES AS
SELECT NAME
,MEMNAME
FROM DICTIONARY.COLUMNS
WHERE LIBNAME='LIBNAME'
ORDER BY 1,2;
RUN;
加入我的统计表
PROC SQL;
CREATE TABLE STATS_NEW AS
SELECT memname AS TABLE_NAME,a.*
FROM STATS a
LEFT JOIN SOURCES b
ON a.name = b.name
GROUP BY a.name
ORDER BY a.name;
QUIT;
转置数据并添加逗号分隔符
DATA STATS_TRANSPOSE (drop=TABLE_NAME);
LENGTH INPUT_TABLES $1000;
SET STATS_NEW;
BY name;
RETAIN INPUT_TABLES;
IF FIRST.name THEN DO; INPUT_TABLES=TABLE_NAME; END;
IF NOT FIRST.name
THEN DO;
INPUT_TABLES=CATS(INPUT_TABLES,', ',TABLE_NAME);
END;
IF LAST.name THEN DO;
IF name IN ('FIELD1','FIELD2')
THEN DO; INPUT_TABLES='ALL'; END;
OUTPUT;
END;
RUN;
你可能需要更具体一些才能得到答案。如果您想知道观察来自哪个数据集,请使用数据步骤组合记录,并在SET语句上使用INDSNAME=选项。使用SET语句的数据步骤可能比使用SQL和UNION更好。请提供一些示例数据,说明您正在尝试执行的操作。