Sas SA基于现有组生成新列
我目前正在使用SAS编写一份报告,该报告包含以下表格:Sas SA基于现有组生成新列,sas,Sas,我目前正在使用SAS编写一份报告,该报告包含以下表格: Name Country Pct Flag A USA 40 Y A CAN 30 N A CHN 30 N B BRA 70 N B JAP 30 Y 我想生成一个新列Name\u Flag,它等于该Name具有最高pct的记录的标志。例如,A的name_标志应该是Y,B的name_标志应该是N 有谁能告诉我如何在SAS中实
Name Country Pct Flag
A USA 40 Y
A CAN 30 N
A CHN 30 N
B BRA 70 N
B JAP 30 Y
我想生成一个新列Name\u Flag
,它等于该Name
具有最高pct
的记录的标志。例如,A的name_标志应该是Y,B的name_标志应该是N
有谁能告诉我如何在SAS中实现这一点?非常感谢:)您可能需要对此进行调整,因为我没有运行SAS会话进行测试
proc sort data = flagData;
by pct descending;
run;
data flagDataDone;
retain nameWithHighestPct;
set flagData;
if _n_ = 1 then do;
nameWithHighestPct = name;
end;
name_flag = 'N';
if name = nameWithHighestPct then do;
name_flag = 'Y';
end;
drop nameWithHighestPct;
run;
编辑:基思的答案更简单、更清晰。只有当您的数据已经按名称排序并且数据集很大时,我才建议您采用我的方法,因为它不需要另一种排序。否则,坚持基思的方法 假设数据已按名称排序:
*First we find the correct flag per group;
data BEST_PER_GROUP (keep=Name Name_Flag);
set DATASET;
by Name;
*Need to retain this until we looked at all candidates;
retain highest_pct 0;
retain Name_Flag '';
*Find the flag of the highest Pct;
if Pct > highest_pct then do;
highest_pct = Pct;
Name_Flag = Flag;
end;
*When having looked at all records for a given Name, output the result;
if last.Name then do;
output;
*Reset for next value group of Name;
highest_pct = 0;
Name_Flag = '';
end;
run;
*Merge it back with your data;
data DATASET;
merge DATASET BEST_PER_GROUP;
by Name;
run;
这里有一个稍微简单的解决方案
data have;
input Name $ Country $ Pct Flag $;
datalines;
A USA 40 Y
A CAN 30 N
A CHN 30 N
B BRA 70 N
B JAP 30 Y
;
run;
proc sort data=have;
by name descending pct;
run;
data want;
set have;
by name descending pct;
retain name_flag;
if first.name then name_flag=flag;
run;
您使用什么创建报告?