不同组合的sas计数数
我有一个数据集,里面有一所学校的学生教育信息。 我想知道他们参加过多少不同的学习课程组合。我有硕士和学士学位的信息,我想统计每个教育级别(硕士、学士)的不同学习课程的数量 例如,person1可以有:不同组合的sas计数数,sas,Sas,我有一个数据集,里面有一所学校的学生教育信息。 我想知道他们参加过多少不同的学习课程组合。我有硕士和学士学位的信息,我想统计每个教育级别(硕士、学士)的不同学习课程的数量 例如,person1可以有: Bachelor: - study1 - study2 - study3 - study3 Master: - studyA - studyA 然后我想要3个学士水平的学习课程(学习3不应该算两次),以及1个硕士水平的课程。 每个研究计划都有自己的行-因此在数据集中person1有6行。
Bachelor:
- study1
- study2
- study3
- study3
Master:
- studyA
- studyA
然后我想要3个学士水平的学习课程(学习3不应该算两次),以及1个硕士水平的课程。
每个研究计划都有自己的行-因此在数据集中person1有6行。
我想要每人一行,告诉每个教育水平的学习课程数量:
person number_bachelor number_master
person1 3 1
....etc...
我试过这样做:
proc sql;
create table new as
select distinct personid, name,
count(study) as number_of_bach
from old
group by personid, edu_level, study;
quit;
但它没有给我想要的。
这给了我两行person1,变量“number_of_bach”中的值为1和2
如何编辑此代码以获得所需的结果?这是您想要的吗
DATA old;
INPUT personid edu_level $ study $;
DATALINES;
1 bachelor study1
1 bachelor study2
1 bachelor study3
1 bachelor study3
1 master studyA
1 master studyA
1 master studyB
;
PROC SQL;
CREATE TABLE new AS
SELECT personid, edu_level, COUNT (DISTINCT study) AS num_bach
FROM OLD
GROUP BY personid, edu_level;
QUIT;
列study
在查询中是一个所谓的聚合列(因为COUNT
是一个聚合函数),因此不应包含在groupby
-子句中(否则您的查询也将按“study”分组,并且计数将始终为1)
如果您想让一行中的每个人都有一个,则添加一个PROC TRANSPOSE
:
PROC transpose IN = new OUT = new2;
BY personid;
ID edu_level;
RUN;
(您还可以使用子查询和联接而不是转置来创建更复杂的查询,只要您没有数百万行,转置的开销无关紧要)
为了完整起见,这里是您问题的唯一SQL解决方案:
PROC SQL;
CREATE TABLE new AS
SELECT p.personid, b.num_bachelors, m.num_masters
/* Select unique personids */
FROM (SELECT DISTINCT personid
FROM old) AS p
/* Count number of bachelor-level courses */
LEFT JOIN (SELECT personid,
COUNT(DISTINCT study) AS num_bachelors
FROM old WHERE edu_level = 'bachelor'
GROUP BY personid) AS b on p.personid = b.personid
/* Count number of master-level courses */
LEFT JOIN (SELECT personid,
COUNT(DISTINCT study) AS num_masters
FROM old WHERE edu_level = 'master'
GROUP BY personid) AS m on p.personid = m.personid;
QUIT;
代码:
工作:在这里,排序过程将消除重复记录(如果有)。然后SQL过程只能用于生成学士学位课程的个人计数以及硕士学位课程的计数
输出:
person num_bachelors num_masters
person1 3 1
person2 1 2
非常感谢你的帮助,这正是我想要的。
person num_bachelors num_masters
person1 3 1
person2 1 2