楼主: liuliuqiu
3895 25

[问答] SAS程序请教 [推广有奖]

  • 6关注
  • 2粉丝

副教授

62%

还不是VIP/贵宾

-

威望
0
论坛币
2340 个
通用积分
8.9561
学术水平
3 点
热心指数
5 点
信用等级
5 点
经验
14393 点
帖子
429
精华
0
在线时间
1113 小时
注册时间
2009-3-24
最后登录
2024-2-29

15论坛币
有个SAS程序的问题想请教大家,如下:
hs    code    year1     year2
1     1234    2004    2004
1     2345    2004    2004
1     3456    2004    2004
1     3456    2005    2004
1     4567    2004    2004
1     4567    2005    2004
1     5678    2004    2004
1     5678    2005    2004
1     5678    2006    2004
.......
想要的结果是生成一个新的变量number,如果year1=year2,则number=0,
如果year1不等于year2(一定是year1大于year2),例如,
hs    code    year1     year2
1     3456    2005    2004

year1大于year2,查比2005小也就是2004对应的code的个数(除去自己本身,只数这条数据前面的数据)得到2,再例如
hs    code    year1     year2
1     5678    2006    2004

year1=2006,则看year1=2004和2005时的code的个数,为4
最后的结果是:
hs    code    year1   year2       number
1     1234    2004   2004          0
1     2345    2004    2004         0
1     3456    2004    2004         0
1     3456    2005    2004         2
1     4567    2004    2004         0
1     4567    2005    2004         2  
1     5678    2004    2004         0
1     5678    2005    2004         2
1     5678    2006    2004         4


有些复杂,恳请各位帮忙,如果不清楚的,我可以再解释,多谢多谢

最佳答案

hello_fj 查看完整内容

明白了 你看看是不是这样
关键词:sas程序 Number 请各位帮忙 year code 程序

回帖推荐

FB_FLORA 发表于25楼  查看完整内容

你试试这样行吗? data sample; input hs code year1 year2; unicode=strip(hs)||"-"||strip(code); datalines; 1 1234 2004 2004 1 2345 2004 2004 1 3456 2004 2004 1 3456 2005 2004 1 4567 2004 2004 1 4567 2005 2004 1 5678 2004 2004 1 5678 2005 2004 1 5678 2006 2004 2 2478 2005 2005 2 1234 2005 2005 2 1234 2006 2005 ; proc sql; create table sam1 as select hs , code , max(year1) as ...
沙发
hello_fj 发表于 2014-6-27 09:42:12 |只看作者 |坛友微信交流群
liuliuqiu 发表于 2014-6-27 10:44
不好意思,这点我没有说清楚。其实是这样,code代表是企业的代码,year1代码企业出口的年份,每个企业后面 ...
  1. ata  test;
  2. input hs code year1 year2;
  3. cards;
  4. 1 1234 2004 2004
  5. 1 2345 2004 2004
  6. 1 3456 2004 2004
  7. 1 3456 2005 2004
  8. 1 4567 2004 2004
  9. 1 4567 2005 2004
  10. 1 5678 2004 2004
  11. 1 5678 2005 2004
  12. 1 5678 2006 2004
  13. ;
  14. run;


  15. proc sort data=test;
  16. by code;
  17. run;

  18. data test1;
  19.   set test;
  20.   by code;
  21.   if first.code then n+1;
  22.   else n+0;
  23. run;

  24. proc sort data=test1;
  25. by year1 code;
  26. run;

  27. data want;
  28. set test1;
  29. by year1;
  30. if first.year1 then do;
  31.   retain number;
  32.   if year1=year2 then number=0;
  33.   else number=n-1;
  34. end;
  35. drop n;
  36. run;

  37. proc sort data=want;
  38. by code year1;
  39. run;
复制代码
明白了 你看看是不是这样
已有 3 人评分学术水平 热心指数 信用等级 收起 理由
liuliuqiu + 2 + 2 + 2 热心帮助其他会员
愤怒的老鸟 + 3 + 3 + 3 应该是对的
Tigflanker + 2 + 2 + 2 这个逻辑应该是对的

总评分: 学术水平 + 7  热心指数 + 7  信用等级 + 7   查看全部评分

公众号:SAS与量化投资

使用道具

藤椅
hello_fj 发表于 2014-6-27 09:49:33 |只看作者 |坛友微信交流群
不太明白。。year1大于year2,查比2005小也就是2004对应的code的个数(除去自己本身,只数这条数据前面的数据)得到2   不是应该是3吗

使用道具

板凳
liuliuqiu 发表于 2014-6-27 09:56:20 |只看作者 |坛友微信交流群
hello_fj 发表于 2014-6-27 09:49
不太明白。。year1大于year2,查比2005小也就是2004对应的code的个数(除去自己本身,只数这条数据前面的数 ...
查year1=2004的个数是3,是
hs    code    year1   year2       number
1     1234    2004   2004          0
1     2345    2004    2004         0
1     3456    2004    2004         0
但是,要除去code=3456,也就是自身的情况,这样只剩下前两个code=1234和2345了。
谢谢

使用道具

报纸
liuliuqiu 发表于 2014-6-27 10:20:52 |只看作者 |坛友微信交流群
在线等,请各位帮忙解答一下吧,多谢多谢

使用道具

地板
wwang111 发表于 2014-6-27 10:21:31 |只看作者 |坛友微信交流群
是这个意思吗?

data test;
input hs    code    year1     year2;
cards;
1     1234    2004    2004
1     2345    2004    2004
1     3456    2004    2004
1     3456    2005    2004
1     4567    2004    2004
1     4567    2005    2004
1     5678    2004    2004
1     5678    2005    2004
1     5678    2006    2004
;

%macro cnt;
proc sql noprint;
select max(year1-year2) into: maxnum
from test;
quit;
data wanted;
set test;
if hs ne lag(hs) then call missing(n);
if code ne lag(code) then n+1;
if year1=year2 then number=0;
%let i=1;
%do i=1 %to &maxnum;
if number=. then flag&i+1;
if year1-year2=&i then number=n-flag&i;
%end;
drop n flag:;
run;
%mend;
%cnt
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 2 + 2 + 2 热心帮助其他会员

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

使用道具

7
hello_fj 发表于 2014-6-27 10:27:22 |只看作者 |坛友微信交流群
liuliuqiu 发表于 2014-6-27 09:56
查year1=2004的个数是3,是
hs    code    year1   year2       number
1     1234    2004   2004     ...
有点复杂1     5678    2005    2004      不是应该也是4吗?1234  2345 3456 4567

使用道具

8
liuliuqiu 发表于 2014-6-27 10:44:43 |只看作者 |坛友微信交流群
hello_fj 发表于 2014-6-27 10:27
有点复杂1     5678    2005    2004      不是应该也是4吗?1234  2345 3456 4567
不好意思,这点我没有说清楚。其实是这样,code代表是企业的代码,year1代码企业出口的年份,每个企业后面跟着不同的year1值,只有最大的那个是企业真正出口的时间。例如code=5678,year1=2004.2005.2006,  企业5678出口产品1的年份是2006年,2006年对应的number值指在2006年前(2004.2005年)出口产品1的企业个数,即1234.2345.3456和4567,而2005后面的number值是指在2005年前(2004)有多少个其他企业出口,这样,寻找year1<2005的企业个数,就有1234和2345.
也就是说,每个不同的code值,只要year1值相同,number的值也相同。上例中,year1=2004时,number=0;year1=2005时,number=2。。。。

使用道具

9
Tigflanker 发表于 2014-6-27 10:59:41 |只看作者 |坛友微信交流群
看明白了,但是code逻辑有点复杂。。

你可以先请教大神用hash table给你算下,hash我不太会用。我在编数组。

  1. data one;
  2.   input hs    code    year1     year2;
  3.   cards;
  4. 1     1234    2004    2004
  5. 1     2345    2004    2004
  6. 1     3456    2004    2004
  7. 1     3456    2005    2004
  8. 1     4567    2004    2004
  9. 1     4567    2005    2004
  10. 1     5678    2004    2004
  11. 1     5678    2005    2004
  12. 1     5678    2006    2004
  13. ;run;

  14. proc sql noprint;
  15.   select count(distinct year1) into: dist from one;
  16. quit;

  17. data two(drop = inn: i j);
  18.   set one;
  19.   array inn[%trim(&dist.)] $100 inn1 - inn%trim(&dist.);
  20.   retain inn;

  21.   do i = 1 to %trim(&dist.);
  22.     j = 2004 - 1 + i;
  23.     if year1 >= j then
  24.     inn[i] = ifc(indexw(inn[i],cats(code)),inn[i],catx(' ',inn[i],code));
  25.   end;

  26.   if year1 > 2004 then do;
  27.     inn0 = inn1;
  28.     if year1 ^= 2004 + 1 then
  29.     do i = 1 to %trim(&dist.);
  30.       do j = 1 to count(inn[i],' ') + 1;
  31.         inn0 = ifc(indexw(inn0,scan(inn[i],j)),inn0,catx(' ',inn0,scan(inn[i],j)));
  32.           end;
  33.     end;
  34.   end;
  35.   result = ifn(year1 = year2,0,count(cats(inn0),' '));
  36. run;
复制代码

我按你一开始给的逻辑编了一下,但是结果貌似并不是你说的那样。

使用道具

10
liuliuqiu 发表于 2014-6-27 11:02:47 |只看作者 |坛友微信交流群
Tigflanker 发表于 2014-6-27 10:59
看明白了,但是code逻辑有点复杂。。
哎,是挺复杂的,连表述清楚都很费劲,能不能帮忙尝试一下呀,数据实在太多了,没法一个个看。
非常感谢。

使用道具

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

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

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

GMT+8, 2024-4-27 02:49