看板 Statistics 關於我們 聯絡資訊
※ 引述《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