2014-05-01 3 views
0

변수 이름으로 값을 사용하여 데이터를 조 변경하고 그룹별로 숫자 데이터를 요약하려고합니다. proc transpose와 proc report (가로 질러)를 시도했지만 시도 할 수 없습니다. 내가이 일을 알고이, 유일한 방법은 (다른 사람과 합계하지만 만약 변경이 동적으로하지 않은) 데이터 세트입니다 나는이 데이터 세트가 예를 들어SAS는 값을 열 이름으로 사용하여 요약합니다.

:

school name subject  picked saving expenses 
raget John math   10  10500 3500 
raget John spanish  5  1200  2000 
raget Ruby nosubject 10  5000  1000 
raget Ruby nosubject 2  3000  0 
raget Ruby math   3  2000  500 
raget peter geography 2  1000  0 
raget noname nosubject 0  0  1200 

내가 필요를 1 줄에 학생들의 이름으로 '집어 넣은'합계와 나중에 주제별로 집계 한 합계, 마지막 3 열은 집안일, 저장 및 비용의 합계입니다.

school john ruby peter noname math spanish geography nosubject picked saving expenses 
raget 15 15 2  0  13 5  2   12  32  22700 8200 

학교 또는 과목에 새로운 학생이 생길 경우 동적으로 변경 될 수 있습니까?

답변

1

둘 이상의 단계로 요약 했으므로 조금 어려워서 PROC SUMMARY을 사용하고 다른 _TYPE_ 값을 선택했습니다. 아래를 참조하십시오 :

 
data have; 
    infile datalines; 
    input school $ name $ subject : $10. picked saving expenses; 
    datalines; 
raget John math   10  10500 3500 
raget John spanish  5  1200  2000 
raget Ruby nosubject 10  5000  1000 
raget Ruby nosubject 2  3000  0 
raget Ruby math   3  2000  500 
raget peter geography 2  1000  0 
raget noname nosubject 0  0  1200 
; 
run; 

proc summary data=have; 
    class school name subject; 
    var picked saving expenses; 
    output out=want1 sum(picked)=picked sum(saving)=saving sum(expenses)=expenses; 
run; 

proc transpose data=want1 (where=(_type_=5)) out=subs (where=(_NAME_='picked')); 
    by school; 
    id subject; 
run; 

proc transpose data=want1 (where=(_type_=6)) out=names (where=(_NAME_='picked')); 
    by school; 
    id name; 
run; 

proc sql; 
    create table want (drop=_TYPE_ _FREQ_ name subject) as 
    select 
    n.*, 
    s.*, 
    w.* 
    from want1 (where=(_TYPE_=4)) w, 
    names (drop=_NAME_) n, 
    subs (drop=_NAME_) s 
    where w.school = n.school 
    and w.school = s.school; 
quit; 

나는 또한이 코드를 새로운 학교, 이름 및 과목을 추가하여 테스트했으며 최종 표에 나타납니다. 아무 것도 코딩하지 않았 음을 알 수 있습니다 (예 : math 또는 John). 따라서 코드는 충분히 동적입니다.

1

PROC REPORT는 흥미로운 대안입니다. 특히 데이터 세트가 아닌 인쇄 된 출력물을 원한다면 더욱 그렇습니다. ODS OUTPUT을 사용하여 출력 데이터 세트를 가져올 수 있지만 변수 이름이 어떤 이유 ("C2"등)로 정의되어 있지 않으므로 지저분합니다. 헤더 행이 정렬되지 않았으므로이 인쇄물의 출력물이 조금 엉망이긴하지만 원하는 경우 일부 고정 될 수 있습니다.

data have; 
input school $ name $ subject  $ picked saving expenses; 
datalines; 
raget John math   10  10500 3500 
raget John spanish  5  1200  2000 
raget Ruby nosubject 10  5000  1000 
raget Ruby nosubject 2  3000  0 
raget Ruby math   3  2000  500 
raget peter geography 2  1000  0 
raget noname nosubject 0  0  1200 
;;;; 
run; 

ods output report=want; 
proc report nowd data=have; 
columns school (name subject),(picked) picked=picked2 saving expenses; 
define picked/analysis sum ' '; 
define picked2/analysis sum; 
define saving/analysis sum ; 
define expenses/analysis sum; 
define name/across; 
define subject/across; 
define school/group; 
run; 
관련 문제