【发布时间】:2019-04-18 14:04:44
【问题描述】:
我有一个很大的表,我想替换稀有值(对于这个例子,出现次数少于 10 但实际情况更复杂——它可能有 1000 个级别,而我只想有 15 个)。这个可能级别的列表可能会改变,所以我不想硬编码任何东西。
我的代码是这样的:
%let var = Make;
proc sql;
create table stage1_ as
select &var.,
count(*) as count
from sashelp.cars
group by &var.
having count >= 10
order by count desc
;
quit;
/* Join table with table including only top obs to replace rare
values with "other" category */
proc sql;
create table stage2_ as
select t1.*,
case when t2.&var. is missing then "Other_&var." else t1.&var. end as &var._new
from sashelp.cars t1 left join
stage1_ t2 on t1.&var. = t2.&var.
;
quit;
/* Drop old variable and rename the new as old */
data result;
set stage2_(drop= &var.);
rename &var._new=&var.;
run;
它可以工作,但不幸的是它不是很有效,因为它需要为每个变量进行连接(在实际情况下,我是在循环中进行的)。 有更好的方法吗?也许一些智能替换功能?
谢谢!!
【问题讨论】:
-
对于字符变量的情况,比如将
pqr映射到pqr_new,不是 10-最频繁(您的定义pqr的 rare) 值将更改为文字"Other_pqr"。对于数字变量的情况,比如xyz被 映射 到xyz_new,由于它是罕见的数值,将使用什么文字值来表示差异性? -
级别的数量并不是真正的问题,混乱会更多来自变量的数量。你要处理多少个变量?您想自动映射所有变量,还是只映射您指定的变量?
标签: sas