作者Clalin (CLA)
看板Statistics
标题[程式] sas资料处理问题
时间Wed Apr 13 01:56:56 2016
[软体程式类别]:
sas
[程式问题]:
资料处理
[软体熟悉度]:
新手
[问题叙述]:
目前手上的资料如下:
公司 员工 年度 薪酬 排名(依公司当年度薪酬)
甲 A 2000 400 1
甲 B 2000 300 2
甲 C 2000 200 3
乙 D 2002 600 1
乙 E 2002 500 2
丙 F 2005 750 1
丙 G 2005 650 2
丙 H 2005 550 3
丙 I 2005 450 4
我想要让每间公司每一年度的资料比数都是3笔
如果超过三笔 就删除薪酬最少的资料
如果不足三笔 就用最少薪酬将资料补足到3笔
也就是想要让资料变成这样:
公司 员工 年度 薪酬 排名(依公司当年度薪酬)
甲 A 2000 400 1
甲 B 2000 300 2
甲 C 2000 200 3
乙 D 2002 600 1
乙 E 2002 500 2
乙 E 2002 500 3
丙 F 2005 750 1
丙 G 2005 650 2
丙 H 2005 550 3
目前使用基本的proc rank方式依公司代号和年份将薪酬做排名
并将排名大於3的资料删除:
proc rank out=rank descending;
var 薪酬
ranks rank;
by cusip year;
run;
data A;
set rank;
if rank>3 then delete;
run;
但是现在不知道要怎麽将当年度资料不足三笔的公司以最少薪酬的资料补到三笔
有试图使用sql但是是新手不太会使用
希望有高手可以开示一下 谢谢 >"<
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.119.150.103
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Statistics/M.1460483818.A.427.html
※ 编辑: Clalin (223.137.217.198), 04/13/2016 01:58:28
1F:推 laba5566: If last.公司 and rank <3 then do until (rank=3) outp 04/13 02:51
2F:→ laba5566: ut; rank= rank+1; end; 04/13 02:51
我实际上要将资料补足到5笔,目前程式码如下:
data A1;
set A;
by cusip year;
if last.cusip and last.year and rank<5 then do while (rank=5);
rank=rank+1;
end;
else output;
run;
但是这样并没有把各公司各年度资料补到5笔,总笔数甚至比data A还少一点,
请问我有哪里打错,或是可以用其他方法吗?QQ
※ 编辑: Clalin (140.119.150.103), 04/13/2016 15:15:21
3F:推 h14753951: 先将cusip和year合并成一个栏位 04/13 17:00
4F:→ h14753951: 然後排序,其余城市写法同你刚刚po的,只是else要拿掉 04/13 17:02
5F:→ h14753951: 并把output写在end前,如此是产生一个额外的dataset 04/13 17:04
6F:→ h14753951: 你还是要把它并回原本的dataset,并做整理 04/13 17:04