我有一个SAS代码,我使用数据集命令来组合3个文件。本周,我们有一些实例,其中一个输入文件的行数为零。这导致文件格式不正确(所有列都是数字),因此数据步骤失败?有没有办法覆盖如果输入行为零则列格式必须一致的要求?
data combined_file;
set file1 file2 file3;
run;
答案 0 :(得分:3)
不,我认为你不能克服这种行为。
当您同时设置数据集时,如果在一个数据集中存在数字且在另一个数据集中存在字符,则SAS将抛出错误。在处理任何记录之前,在编译时生成此错误。
我同意@Tom最好的办法是解决为什么用所有数字变量创建数据集的根本问题。
如果需要解决方法,可以考虑使用宏语言检查数据集是否为空。您最终会得到一个宏,它有条件地生成要包含在SET语句中的数据集列表,例如:
%macro ...;
data combined_file;
set
%if %anyobs(file1) %then file1 ;
%if %anyobs(file2) %then file2 ;
%if %anyobs(file3) %then file3 ;
;
run;
%mend;
如果您想尝试这种解决方法并想要帮助编写%anyobs,只需删除评论,我就会发布我使用的评论。它基于杰克汉密尔顿的%MTANYOBS,如本文所述:http://www2.sas.com/proceedings/sugi26/p095-26.pdf。
答案 1 :(得分:1)
我同意Quentin的问题,但我的解决方案略有不同。
不是在某些%if
语句周围有一个包装器宏,而是为设置行写一个宏。
%macro checkAny(ds=);
%if %anyobs(&ds) %then &ds. ;
%mend checkAny;
data want;
set
%checkAny(ds=file1)
%checkAny(ds=file2)
%checkAny(ds=file3)
;
run;
当然还有Quentin指出的%anyobs
宏。
您也可以将其更改为,而不是检查观察结果,检查列是否相同。如果您有特定的列模式,则可以编写一个宏来检查dictionary.columns
以验证它们是否完全相同。
答案 2 :(得分:0)
如果问题是跨数据集冲突相同变量名的类型,为什么不直接检查?
PROC CONTENTS DATA=file1 OUT=var1 NOPRINT ;
RUN ;
PROC CONTENTS DATA=file2 OUT=var2 NOPRINT ;
RUN ;
PROC CONTENTS DATA=file3 OUT=var3 NOPRINT ;
RUN ;
PROC SQL ;
SELECT COUNT(*)
INTO :bad12
FROM var1 v1
INNER JOIN
var2 v2
ON UPCASE(v1.name) EQ UPCASE(v2.name)
WHERE v1.type NE v2.type
;
SELECT COUNT(*)
INTO :bad13
FROM var1 v1
INNER JOIN
var3 v3
ON UPCASE(v1.name) EQ UPCASE(v3.name)
WHERE v1.type NE v3.type
;
SELECT COUNT(*)
INTO :bad23
FROM var2 v2
INNER JOIN
var3 v3
ON UPCASE(v2.name) EQ UPCASE(v3.name)
WHERE v2.type NE v3.type
;
QUIT ;
此时你可以查看是否& bad12 +& bad13 +& bad23 EQ 0.如果是,请继续。如果没有,请退出。