我有很多具有不同列(变量)名称的表,唯一常见的是名为 Date 的列,所以我有很多数据,每个都有一定的日期。
要测试某些列是否有任何缺失值,我必须为每个表编写sql查询,如下所示:
proc sql;
create table check as
select Date, count(Date) as date_count, count(col_x) as col_x, count(col_y) as col_y, ..
from certain_table
group by Date;
quit;
所以我必须为每个表手动写 count(xxx)作为yyy 部分。
有没有办法编写某种通用查询,可以自动计算表中按一列(我的情况下为日期)分组的每列的非缺失行,并以类似于由上面的代码?
答案 0 :(得分:4)
我正在寻找识别哪些列包含缺失数据的路线,因为这似乎是您主要关注的内容。我还假设你的变量是字符和数字的混合,我的解决方案将适用于两者。 PROC FREQ中有一个NLEVELS选项,用于输出列中不同值的数量,并且单独显示任何缺失值。下面是示例代码,如果您想按日期对数据进行分组,那么您必须预先分配表并在PROC FREQ中放置BY语句。
data class;
set sashelp.class;
if _n_=1 then call missing(name,height); /* set a couple of variables to missing in row 1 */
run;
ods select nlevels; /* only calculate the nlevels stats */
ods output nlevels=want; /* output results to a dataset */
proc freq data=class nlevels;
run;
;
答案 1 :(得分:1)
PROC TABULATE可以轻松地为您完成此操作,几个统计PROC也可以。我在_numeric_
执行此操作,这允许我使用var
而不是class
,输出更好。如果确实需要字符变量,可以使用类来执行此操作,只删除不感兴趣的行。
proc tabulate data=sashelp.class out=want;
var _numeric_;
tables _numeric_,n nmiss;
run;