楼主: bengda123666
2982 5

[问答] sas分组统计频率求助 [推广有奖]

  • 0关注
  • 0粉丝

大专生

1%

还不是VIP/贵宾

-

威望
0
论坛币
1118 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
88 点
帖子
8
精华
0
在线时间
72 小时
注册时间
2016-9-6
最后登录
2021-12-14

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有四个变量:ticker,estimid,analyst,revdatsyear,需要统计在同一个ticker同一个estimid同一个analyst的情况下,revdatsyear出现的不同年份。
比如:
ticker estimid analyst revdatsyear
0001  AAA       J          1999
0001  AAA       J          2000
0001  AAA       J          2000
0001  CCC       A         2004

希望得到的结果
ticker estimid analyst revdatsyear count(revdatsyear)
0001  AAA       J          1999           2
0001  AAA       J          2000           2
0001  AAA       J          2000           2
0001  CCC       A         2004           1


即ticker 0001,estimid AAA,analyst J,revidats有1999(1次),2000(2次),数出来的revdatsyear等于2,而不是等于3

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:不同年份

已有 1 人评分热心指数 收起 理由
eijuhz + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

沙发
whymath 发表于 2018-8-11 21:51:35 |只看作者 |坛友微信交流群
简单。其实就是Excel表格中的分类汇总。

利用 if first.variable 语句完成,代码如下:
  1. data test;
  2.         input ticker$ estimid$ analyst$ revdatsyear$;
  3.         cards;
  4.         0001  AAA       J          1999
  5.         0001  AAA       J          2000
  6.         0001  AAA       J          2000
  7.         0001  CCC       A         2004
  8.         ;
  9. run;

  10. proc sort data = test;
  11.         by ticker estimid analyst revdatsyear;
  12. run;

  13. data test;
  14.         set test;
  15.         by ticker estimid analyst revdatsyear;

  16.         if first.revdatsyear then Count = 1;
  17.         else Count + 1;
  18. run;
复制代码

SASUSER

使用道具

藤椅
dahaixiaoyu121 发表于 2018-8-15 14:16:19 |只看作者 |坛友微信交流群
这个有BUG   如果是不同编号的 相同年份,可能出错

使用道具

板凳
bengda123666 发表于 2018-8-15 17:04:32 |只看作者 |坛友微信交流群
谢谢大家,问题已解决,用的code如下,思路有点麻烦:
proc sort data =analystchara1 out=analystchara2;
        by ticker estimid analyst revdatsyear;
run;
data analystchara2;
        set analystchara2;
        by ticker estimid analyst revdatsyear;
        if first.revdatsyear then Count = 1;
        else Count=0;
run;
proc sql;
create table analystchara3 as
select *,sum(count)as FIRM_EXP
from analystchara2
group by ticker,estimid,analyst;
quit;

使用道具

报纸
steven_1017 发表于 2018-8-17 12:33:31 |只看作者 |坛友微信交流群
也可以不用proc sql。
data work.t;
input ticker $ estimid $ analyst $ revdatsyear;
datalines;
0001 AAA J          1999
0001 AAA J          2000
0001 AAA J          2000
0001 CCC A          2004
;
run;

proc sort data=work.t out=work.t1 nodup;
by estimid analyst revdatsyear;
run;

data work.t1 (drop=revdatsyear);
set work.t1;
by estimid analyst revdatsyear;
if first.analyst then count=0;
count + 1;
if last.analyst;
run;


data work.t2;
merge t t1;
by descending analyst;
run;

使用道具

地板
bengda123666 发表于 2018-8-22 19:09:25 |只看作者 |坛友微信交流群
steven_1017 发表于 2018-8-17 12:33
也可以不用proc sql。
data work.t;
input ticker $ estimid $ analyst $ revdatsyear;
谢谢~这种方法也好用

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-19 22:27