我有不同员工薪水的数值。我想把范围分成几类。但是我不想要新的列,我想将现有的salary列格式化为这个范围方法:
至少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;
答案 0 :(得分:1)
Proc Format是正确的方法,您需要一种数字格式:
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.;
这应该有助于您入门。
答案 1 :(得分:0)
我创建了一个模仿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;