使用范围系统对 SAS 中的变量进行分类

Categorizing variabels in SAS using a range system

我有不同员工的薪水数值。我想将范围分成几类。但是我不想要一个新列,我只想将现有的工资列格式化为这个范围方法:

至少 $20,000 但少于 $100,000 -

至少 100,000 美元,最高 500,000 美元 - >100,000 美元

缺少 - 缺少工资

任何其他值 - 薪水无效

我在性别方面做过类似的事情。我只想使用 proc 打印和格式命令来显示工资和性别。

DATA Work.nonsales2;
SET Work.nonsales;
RUN;

PROC FORMAT; 
VALUE $Gender 
'M'='Male' 
'F'='Female' 
'O'='Other'  
other='Invalid Code';

PROC FORMAT; 
VALUE salrange 
'At least ,000 but less than 0,000    '=<0,000 
 other='Invalid Code';


PROC PRINT;
title 'Salary and Gender';
title2 'for Non-Sales Employees';
format gender $gender.;
RUN;

Proc 格式是正确的方法,您需要数字格式:

 proc format;
 value salfmt
 20000 - <100000 = "At least ,000 but less than 0,000"
 100000 - 500000 = "100,000 +"
 . = 'Missing'
 other = 'Other';

然后在您的印刷品中应用格式,类似于您为性别所做的。

format salary salfmt.;

这应该可以帮助您入门。

我创建了一个模仿 R cut 函数的小函数:

options cmplib=work.functions;
proc fcmp outlib=work.functions.test;
function cut2string(var, cutoffs[*], values[*] $) $;
    if var <cutoffs[1] then return (values[1]);
    if var >=cutoffs[dim(cutoffs)] then return (values[dim(values)]);
    do i=1 to dim(cutoffs);
        if var >=cutoffs[i] & var <cutoffs[i+1] then return (values[i+1]); 
    end;
    return ("Error, this shouldn't ever happen");

endsub;

run;

然后你可以像这样使用它:

data Work.nonsales2;
    set Work.nonsales;
    array cutoffs[3] _temporary_ (20000 100000 500000);
    array valuesString[4]  _temporary_ ("<20k " "20k-100k" "100k-500k" ">500k");

    salary_string  = cut2string(salary ,cutoffs,valuesString);
run;