我想知道是否有一种方法可以在数据不是数字时对数据进行分类。有没有办法在单行中指定if-then语句的所有条件?
这是我的代码的一部分。
data new;
set old;
if target EQ 'purchase|laboratory|dept' then category = 'internal';
if target EQ 'purchase|office|member' then category ='internal';
if target EQ 'purchase|floor|ext' then category='external';
run;
答案 0 :(得分:3)
库尔:
您可以使用if / then / else
逻辑在单个语句中执行所有分配
if target EQ 'purchase|laboratory|dept' then category = 'internal'; else
if target EQ 'purchase|office|member' then category ='internal'; else
if target EQ 'purchase|floor|ext' then category='external';
您的if then else
的长篇约可以在select
声明中明确说明
select (target);
when ('purchase|laboratory|dept') category = 'internal';
when ('purchase|office|member') category = 'internal';
when ('purchase|floor|ext') category = 'external';
otherwise category = 'other';
end;
括号是必需的。
自定义格式也可用于许多值映射到几个类别值的情况,以及单独处理target
作为格式化分类(例如class target; format target $target_cat.;
)的情况。好处是映射存储为数据而不是SAS源代码。
* mapping data;
data target_categories;
length target $60 category $20;
input target & category; datalines;
purchase|laboratory|dept internal
purchase|office|member internal
purchase|floor|ext external
run;
* conform mapping data to proc format cntlin= requirements;
data format_data;
set target_categories;
start = target;
label = category;
fmtname = '$target_cat';
run;
* construct custom format;
proc format cntlin=format_data;
run;
示例数据
data old;
do x = 1 to 20;
target = 'purchase|laboratory|dept'; output;
target = 'purchase|office|member'; output;
target = 'purchase|floor|ext'; output;
end;
run;
使用put
data new;
set old;
category = put (target,$target_cat.);
run;
您也可以在不创建第二个变量的情况下处理数据。例如
proc tabulate data=old;
class target;
format target $target_cat.; * reported values will show internal/external;
table target, n / nocellmerge;
run;