h**h 发帖数: 488 | 1 ID Code
01 111
01 111
01 112
01 111
02 111
02 112
02 112
现在我要弄成
ID Code Count
01 111 3
01 112 1
02 112 2
02 111 1
就是把unique的Code count出来,从大到小排。SAS Proc SQL count怎么做。 |
l******m 发帖数: 111 | 2 PROC SQL;
CREATE TABLE X1 AS
SELECT DISTINCT ID,CODE,COUNT(CODE) AS COUNT
FROM (YOUR DATA)
GROUP BY ID,CODE
ORDER BY ID , COUNT DESC
;
QUIT; |
z**o 发帖数: 149 | 3 select count(distinct code) as n
from ..
group by id, code
order by id, code
;
【在 h**h 的大作中提到】 : ID Code : 01 111 : 01 111 : 01 112 : 01 111 : 02 111 : 02 112 : 02 112 : 现在我要弄成 : ID Code Count
|
h**h 发帖数: 488 | 4 我是没有开始select distinct ID, 所以怎么group都不成。
再问一下,如果要在每个ID里只挑选Count中前5名的,能在SQL中完成吗? |
o*******w 发帖数: 2310 | 5 proc sql outobs=5;
【在 h**h 的大作中提到】 : 我是没有开始select distinct ID, 所以怎么group都不成。 : 再问一下,如果要在每个ID里只挑选Count中前5名的,能在SQL中完成吗?
|
h**h 发帖数: 488 | 6 这只列出first 5 observations, 不是给每个ID的。
【在 o*******w 的大作中提到】 : proc sql outobs=5;
|
l******m 发帖数: 111 | 7 貌似SAS的SQL没有top的function,一定要用SAS SQL来写的话,试着用table自己left
join 自己。用SAS 其他function来写的话比较容易实现一点,但是对于大型数据比较
吃力 |
h**h 发帖数: 488 | 8 折腾了好久,是不行。只能用data step了。有简单的方法吗?
left
【在 l******m 的大作中提到】 : 貌似SAS的SQL没有top的function,一定要用SAS SQL来写的话,试着用table自己left : join 自己。用SAS 其他function来写的话比较容易实现一点,但是对于大型数据比较 : 吃力
|
l******m 发帖数: 111 | 9 proc sql ;
create table want as
select a.*
from (result) as a
left join (result) as b on (a.id=b.id and a.count<=b.count)
group by a.id, a.count
having count(*) <=5
order by a.id, a.count desc ;
quit;
这样会有一个问题,举例来说当ID是01时候,111有10个,112有9个,113有8个,114有
7个,115和116都是6个,前5名应该是111-114,加上115或者116,但是用这种方法没有
办法得到。 |
h**h 发帖数: 488 | 10 其实我想要的是这样的,count以后会出现这样的结果,
ID Code Count
01 111 4
01 112 3
01 113 2
01 114 1
02 112 4
02 111 3
02 114 2
02 113 1
每个ID之想保留count前2名的,就是选成。
ID Code Count
01 111 4
01 112 3
02 112 4
02 111 3
因为有的ID拥有的code非常多,不想全保留。 |