楼主: wqll12345
1661 7

怎样按年统计出现的年数 [推广有奖]

  • 0关注
  • 0粉丝

大专生

95%

还不是VIP/贵宾

-

威望
0
论坛币
569 个
通用积分
0.4500
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
148 点
帖子
13
精华
0
在线时间
109 小时
注册时间
2013-12-26
最后登录
2024-1-23

150论坛币

sas中,怎样逐年统计每个名字累计出现的年数(nianshu)和截至该年份累计出现的次数(zongji),请教各位大神!本人初学,能告知完整的代码吗

原数据集

data  a

num   year  name

01    2005  LH

02    2005  ZR

03    2005  LH

04    2006  ZR

05    2006  ZR

06    2006  LM

得到的数据集

Data  b

num   year  name   nianshu   zongji

01    2005  LH       1       2

02    2005  ZR       1       1

03    2005  LH       1       2

04    2006  ZR       2       3

05    2006  ZR       2       3

06    2006  LM       1       1


最佳答案

l1i2n3i4n5g 查看完整内容

data a; input num $ year name $; cards; 01 2005 LH 02 2005 ZR 03 2005 LH 04 2006 ZR 05 2006 ZR 06 2006 LM ; run; proc sort data=a nodupkey out=a1; by name year; run; data a2; set a1; by name; if first.name then nianshu=1; else nianshu+1; run; proc sort data=a out=b1; by name year; run; data b2; set b1; by name year; if first.name then zongj ...
关键词:Data year name ans ear 统计

回帖推荐

吕小布韦 发表于6楼  查看完整内容

我是分步实现的,不知道是否合你意。 逐年每个名字出现的年数:结果: Obs num year name nianshu 1 1 2005 LH 1 2 6 2006 LM 1 3 2 2005 ZR 1 4 4 2006 ZR 2 截止该年份累计出现的次数:结果: name year zongji ---------------------------- LH 2005 2 LM 2006 ...
沙发
l1i2n3i4n5g 在职认证  发表于 2016-10-31 21:41:09 |只看作者 |坛友微信交流群
data a;
input num $ year name $;
cards;
01    2005  LH
02    2005  ZR
03    2005  LH
04    2006  ZR
05    2006  ZR
06    2006  LM
;
run;

proc sort data=a nodupkey out=a1;
by name year;
run;

data a2;
set a1;
by name;
if first.name then nianshu=1;
else nianshu+1;
run;

proc sort data=a out=b1;
by name year;
run;

data b2;
set b1;
by name year;
if first.name then zongji=1;
else zongji+1;
if last.year;
run;

proc sql;
create table wanted as
select *
from a left join a2
on a.year=a2.year and a.name=a2.name;
run;
create table wanted as
select *
from wanted left join b2
on wanted.year=b2.year and wanted.name=b2.name;
quit;

proc sort data=wanted;
by num;
run;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 30 + 2 + 2 + 2 热心帮助其他会员

总评分: 论坛币 + 30  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

使用道具

藤椅
wang1839 在职认证  发表于 2016-10-31 23:17:22 |只看作者 |坛友微信交流群
先SORT BY NAME,求出累计年数;在sort year,求出次数,用if first.v then num=1;esle num+1求
已有 1 人评分论坛币 热心指数 收起 理由
admin_kefu + 20 + 2 热心帮助其他会员

总评分: 论坛币 + 20  热心指数 + 2   查看全部评分

使用道具

板凳
the_fly_winds 发表于 2016-10-31 23:20:59 |只看作者 |坛友微信交流群
实现这个程序的算法太多了, 我这里给出两种供楼主选择.

  1. data a;
  2. input year name $;
  3. cards;
  4. 2005  LH

  5. 2005  ZR

  6. 2005  LH

  7. 2006  ZR

  8. 2006  ZR

  9. 2006  LM

  10. run;

  11. /*第一种方法,会打印出结果*/
  12. proc freq data=a;
  13. table year*name;
  14. run;

  15. /*第二种方法,在数据集b中查看*/
  16. proc sql;
  17. create table b as
  18. select year,name,count(name) as zongji
  19. from a
  20. group by name;
  21. quit;
复制代码


楼主记得评选给论坛币哦. 急需.
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
wqll12345 + 1 + 1 + 1 热心帮助其他会员
admin_kefu + 20 + 2 热心帮助其他会员

总评分: 论坛币 + 20  学术水平 + 1  热心指数 + 3  信用等级 + 1   查看全部评分

使用道具

报纸
wqll12345 发表于 2016-11-1 08:02:20 |只看作者 |坛友微信交流群
the_fly_winds 发表于 2016-10-31 23:20
实现这个程序的算法太多了, 我这里给出两种供楼主选择.
这个不是逐年统计的结果哈,是每个姓名下的合计数

使用道具

地板
吕小布韦 发表于 2016-11-1 11:04:34 |只看作者 |坛友微信交流群
我是分步实现的,不知道是否合你意。
逐年每个名字出现的年数:
  1. proc sort data=test out=a1 nodupkey;
  2. by name year;
  3. run;

  4. data a1;
  5. set a1;
  6. by name year;
  7. if first.name then nianshu=0;
  8. nianshu+1;
  9. run;
  10. proc print data=a1;
  11. run;
复制代码
结果:
Obs    num    year    name    nianshu

1      1     2005     LH        1
2      6     2006     LM        1
3      2     2005     ZR        1
4      4     2006     ZR        2


截止该年份累计出现的次数:
  1. proc sql;
  2. select a.name,a.year,count(*) from
  3. (select name,year,count(*) from test group by name,year) as a
  4. inner join
  5. test b on a.name=b.name and a.year>=b.year group by a.name,a.year;
复制代码
结果:
name          year    zongji
----------------------------
LH            2005         2
LM            2006         1
ZR            2005         1
ZR            2006         3


这样得到的结果,条数和之前的不一样,要想跟之前的一样,可以再merge回去。
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 20 + 2 + 2 热心帮助其他会员
wqll12345 + 1 + 1 + 1 观点有启发

总评分: 论坛币 + 20  学术水平 + 3  热心指数 + 3  信用等级 + 1   查看全部评分

使用道具

7
木子星 发表于 2016-11-1 19:24:22 |只看作者 |坛友微信交流群
很想尝试一下,但楼主的要求似乎读不懂。

使用道具

8
吕小布韦 发表于 2016-11-2 09:49:35 |只看作者 |坛友微信交流群
wqll12345 发表于 2016-11-1 08:02
这个不是逐年统计的结果哈,是每个姓名下的合计数
你选的最佳答案好像有点问题吧?

使用道具

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

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

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

GMT+8, 2024-4-20 01:36