在 PROC SQL 中按格式化变量分组
Group by a formatted variable in PROC SQL
我试图在 PROC SQL 中按自定义格式的变量进行分组,但到目前为止还没有找到解决方案。日志没有错误(如 summary statistic error here)并且所有代码均有效。这是一个简单的例子:
DATA have;
INPUT value1;
DATALINES;
1.22
0.99
0.22
4.00
9.99
;
RUN;
PROC FORMAT;
value valuefmt
low-.99="Below .00"
1-5="-5.00"
5-high="Above .00";
RUN;
DATA have;
set have;
FORMAT value1 valuefmt.;
RUN;
PROC SQL;
SELECT count(*), value1 from have group by value1;
QUIT;
PROC SQL returns 按原始值(value1)而非格式化值分组的计数:
value1
~~~~~~~~~~~~~~~~~~~~~
1 Below .00
1 Below .00
1 -5.00
1 -5.00
1 Above .00
SAS 通过 FREQ 或 TABULATE 允许使用此功能。示例:
PROC TABULATE data=have;
CLASS value1;
TABLE value1;
RUN;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| value1 |
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
|Below .00 | -5.00 |Above .00 |
|~~~~~~~~~~~~+~~~~~~~~~~~~+~~~~~~~~~~~~|
| N | N | N |
|~~~~~~~~~~~~+~~~~~~~~~~~~+~~~~~~~~~~~~|
| 2.00| 2.00| 1.00|
-~~~~~~~~~~~~-~~~~~~~~~~~~-~~~~~~~~~~~~-
关于如何使用 PROC 执行类似操作的任何想法 SQL?
一种方法是在 GROUP BY 子句中使用 PUT() 函数。您可以 return 格式化值。
proc sql;
select count(*) as N
, put(value1,valuefmt.) as CharacterValue
from have
group by 2
;
quit;
否则,如果您想 return 原始类型中的值,则需要添加像 MIN() 这样的聚合函数。您还需要 re-apply 格式。
proc sql;
select count(*) as N
, min(value1) as Formmatted format=valuefmt.
, min(value1) as Raw
from have
group by put(value1,valuefmt.)
;
quit;
结果
N Formmatted Raw
-------------------------------
2 -5.00 1.22
1 Above .00 9.99
2 Below .00 0.22
我试图在 PROC SQL 中按自定义格式的变量进行分组,但到目前为止还没有找到解决方案。日志没有错误(如 summary statistic error here)并且所有代码均有效。这是一个简单的例子:
DATA have;
INPUT value1;
DATALINES;
1.22
0.99
0.22
4.00
9.99
;
RUN;
PROC FORMAT;
value valuefmt
low-.99="Below .00"
1-5="-5.00"
5-high="Above .00";
RUN;
DATA have;
set have;
FORMAT value1 valuefmt.;
RUN;
PROC SQL;
SELECT count(*), value1 from have group by value1;
QUIT;
PROC SQL returns 按原始值(value1)而非格式化值分组的计数:
value1
~~~~~~~~~~~~~~~~~~~~~
1 Below .00
1 Below .00
1 -5.00
1 -5.00
1 Above .00
SAS 通过 FREQ 或 TABULATE 允许使用此功能。示例:
PROC TABULATE data=have;
CLASS value1;
TABLE value1;
RUN;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| value1 |
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
|Below .00 | -5.00 |Above .00 |
|~~~~~~~~~~~~+~~~~~~~~~~~~+~~~~~~~~~~~~|
| N | N | N |
|~~~~~~~~~~~~+~~~~~~~~~~~~+~~~~~~~~~~~~|
| 2.00| 2.00| 1.00|
-~~~~~~~~~~~~-~~~~~~~~~~~~-~~~~~~~~~~~~-
关于如何使用 PROC 执行类似操作的任何想法 SQL?
一种方法是在 GROUP BY 子句中使用 PUT() 函数。您可以 return 格式化值。
proc sql;
select count(*) as N
, put(value1,valuefmt.) as CharacterValue
from have
group by 2
;
quit;
否则,如果您想 return 原始类型中的值,则需要添加像 MIN() 这样的聚合函数。您还需要 re-apply 格式。
proc sql;
select count(*) as N
, min(value1) as Formmatted format=valuefmt.
, min(value1) as Raw
from have
group by put(value1,valuefmt.)
;
quit;
结果
N Formmatted Raw
-------------------------------
2 -5.00 1.22
1 Above .00 9.99
2 Below .00 0.22