如果其余部分相同则除以变量

时间:2016-05-10 15:00:31

标签: sas enterprise

我有一个示例表,如下所示

     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

2 个答案:

答案 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;
相关问题