2016-05-10 2 views
1

У меня есть пример таблица, как показано нижепеременных Разделить, если все остальное же

 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- срок и Subj же. Есть 2 разных профессора с одним и тем же идентификатором: 20 - term и subj, поэтому я разделил час 2. Есть 3 разных профессора с одинаковым id: 30 - term и subj. Итак, я разделил час 3. Итак, выход должен быть таким;

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

В SAS вы можете использовать двойной цикл DOW для достижения этой цели после того, как данные были отсортированы в правильном порядке. В первом цикле подсчитывается, сколько профи имеет один и тот же идентификатор, термин и 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; 
0

Предполагая ваша проблема так же проста, как и вы, приведенный в качестве примера, достаточно одного пакета 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; 
+0

Я не думаю, что вам нужно ключевое слово 'DISTINCT' в этом случае. Он удалит повторяющиеся строки, которые могут существовать в исходных данных. – Tom

+0

Действительный пункт - Удалите его, чтобы уменьшить путаницу. Благодаря! – superfluous