作者MOONY135 (談無慾)
看板Statistics
標題Re: [程式] 一個SAS匯總的問題
時間Thu Jan 22 21:18:04 2015
※ 引述《songhome (爽轟)》之銘言:
: [軟體程式類別]:
: SAS
: [程式問題]:
: 資料處理
: [軟體熟悉度]:
: 低(1~3個月)
: [問題敘述]:
: 有一份原始資料大概長這樣
: (科目幾十個)
: 人 國文 數學 物理 化學 地理 歷史 ....
: A 10 80 70 95 63 45 ....
: B 12 50 48 22 6 10 ....
: C 16 123 45 66 70 89 ....
: ...
: ...
: 我想要得到一張匯總的表長這樣
: 科目 總分 及格人數 59分的人數 介於90~100的人
: 國文 15780 900 50 10
: 數學 50000 100 999 123
: 物理 ...
: 化學 ...
: 地理 ...
: 歷史 ...
: ...
: [程式範例]:
: 之前寫到一半的程式不在手邊 不過邏輯大概是這樣
: 先用匯入原始資料,把第一欄也當作資料而不是變數名稱
: 而欄位名稱自動為F1~F50 (假設科目有49個)
: 接著建立兩個陣列
: array course(49) F2-F50
: array total_score(49) s1-s49
: if _n_~=2 時以計算總分為例子
: 迴圈i 1~49
: total_score(i)+course(i)
: 迴圈結束
: if結束
: 如果最後一筆和第一筆才輸出
: 所以最後我會得到
: F2 F3 ... F50 s1 s2 ... s49
: 國文 數學 ... 天文 . . . .
: 1234 4568 9897 9999
: 然後再讓這個資料集 _n_=2時 用ARRAY讓F2-F50等於s1-s49
: 最後轉置
: 捨棄s1-s49再把分數從文字轉回數字就可以得到我要的表格的其中一個(總分)
: 如果我要算其他項目就要重複產生很多資料集再MERGE起來
: 就算一開始寫在同一個資料集
: 也會變成一個很寬的資料集,感覺怪怪的
: 想請問一下有沒有甚麼比較聰明的寫法
: 謝謝
數字長這樣
人 國文 數學 物理
A 10 80 70
B 12 50 48
C 16 123 45
PROC SORT DATA=RAWDATA OUT=STEP1;
BY "人"n;
RUN;
PROC TRANSPOSE DATA=STEP1 OUT=STEP2;
BY "人"n;
VAR "國文"n "數學"n "物理"n;
RUN;
PROC SQL;
CREATE TABLE WORK.QUERY_FOR_STEP2 AS
SELECT '人'n,
_NAME_ LABEL="科目名稱" AS '科目名稱'n,
COL1 LABEL="得分" AS '得分'n,
SUM(COL1) LABEL="分數加總" AS '分數加總'n
FROM WORK.STEP2
GROUP BY _NAME_
;
QUIT;
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.254.132.240
※ 文章網址: https://www.ptt.cc/bbs/Statistics/M.1421932686.A.563.html
推 songhome: 請問一下科目有幾十個的話 VAR那邊有沒有比較有效率的 01/22 22:01
→ songhome: 做法呢? 01/22 22:01
→ MOONY135: 沒有 但已經夠簡單的了 01/22 22:39
→ MOONY135: 除非你科目那邊已經先換成T1~T20這類的才有辦法用巨集做 01/22 22:40