作者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://webptt.com/cn.aspx?n=bbs/Statistics/M.1421932686.A.563.html
1F:推 songhome: 请问一下科目有几十个的话 VAR那边有没有比较有效率的 01/22 22:01
2F:→ songhome: 做法呢? 01/22 22:01
3F:→ MOONY135: 没有 但已经够简单的了 01/22 22:39
4F:→ MOONY135: 除非你科目那边已经先换成T1~T20这类的才有办法用巨集做 01/22 22:40