【问题标题】:Categorizing variabels in SAS using a range system使用范围系统对 SAS 中的变量进行分类
【发布时间】:2016-05-25 15:13:20
【问题描述】:

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

至少 20,000 美元但低于 100,000 美元 -

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

缺少 - 缺少薪水

任何其他值 - 工资无效

我在性别方面做过类似的事情。我只想使用 proc print 和 format 命令来显示薪水和性别。

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 $20,000 but less than $100,000    '=<$100,000 
 other='Invalid Code';


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

【问题讨论】:

    标签: format sas categories data-manipulation


    【解决方案1】:

    Proc 格式是正确的方法,你需要一个数字格式:

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

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

    format salary salfmt.;
    

    这应该可以帮助您入门。

    【讨论】:

    • 谢谢,我已经开始工作了,但是我对高低命令感到困惑,而不是专门指定从 100000 到 500000 的范围。我可以使用 100,000 >-high 吗?这是否指定了 100,000+?
    • 是的,但这不是您的问题。
    【解决方案2】:

    我创建了一个模仿 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] $10 _temporary_ ("<20k " "20k-100k" "100k-500k" ">500k");
    
        salary_string  = cut2string(salary ,cutoffs,valuesString);
    run;
    

    【讨论】:

    • 你也可以看看很不错的macro版本here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2014-06-30
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多