使用SAS对非数字数据进行分类

时间:2018-03-19 07:41:07

标签: sas

我想知道是否有一种方法可以在数据不是数字时对数据进行分类。有没有办法在单行中指定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;

1 个答案:

答案 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;