我有一个示例表,如下所示
id term subj prof hour
20 2016 COM James 4
20 2016 COM Henrey 4
30 2016 HUM Nelly 3
30 2016 HUM John 3
30 2016 HUM Jimmy 3
45 2016 CGS Tim 3
如果id-term和subj相同,我需要分小时。有两个不同的教授有相同的身份:20 - term和subj,所以我划分小时2。 有3个不同的教授有相同的id:30 - term和subj。所以我分三小时。 所以输出应该是这样的;
id term subj prof hour
20 2016 COM James 2
20 2016 COM Henrey 2
30 2016 HUM Nelly 1
30 2016 HUM John 1
30 2016 HUM Jimmy 1
45 2016 CGS Tim 3
答案 0 :(得分:0)
在SAS中,一旦数据按正确顺序排序,您就可以使用双DOW循环来实现此目的。第一个循环计算具有相同id,term和subj的教授的数量。第二个循环将小时数除以教授数。每次更改id,term或subj时都会执行循环。
我已经创建了一个new_hour变量并保存在临时_counter变量中,这样你就可以看到代码正常工作了,如果你愿意,你可以明显地覆盖小时变量并删除_counter变量
/* create initial dataset */
data have;
input id term subj $ prof $ hour;
datalines;
20 2016 COM James 4
20 2016 COM Henrey 4
30 2016 HUM Nelly 3
30 2016 HUM John 3
30 2016 HUM Jimmy 3
45 2016 CGS Tim 3
;
run;
/* sort data */
proc sort data=have;
by id term subj prof;
run;
/* create output dataset */
data want;
do until(last.subj); /* 1st loop*/
set have;
by id term subj prof;
if first.subj then _counter=0; /* reset counter when id, term or subj change */
_counter+first.prof; /* count number of times prof changes */
end;
do until(last.subj); /* 2nd loop */
set have;
by id term subj;
new_hour=hour / _counter; /* divide hour by number of profs from 1st loop */
output; /* output record */
end;
run;
答案 1 :(得分:0)
假设您的问题与您给出的问题一样简单,那么一个proc sql就足够了。如果它更复杂,请解释如何使我们更有帮助!
data have;
input id term subj $ prof $ hour;
datalines;
20 2016 COM James 4
20 2016 COM Henrey 4
30 2016 HUM Nelly 3
30 2016 HUM John 3
30 2016 HUM Jimmy 3
45 2016 CGS Tim 3
;
run;
proc sql;
create table want as select
*, hour / count(prof) as hour_adj
from have
group by id, subj;
quit;