楼主: liuliuqiu
2297 22

[问答] SAS求教 [推广有奖]

11
liuliuqiu 发表于 2016-8-5 08:58:15 |只看作者 |坛友微信交流群
各位大牛帮帮忙吧,现在还没得到结果

使用道具

12
learsaas 发表于 2016-8-5 11:00:06 |只看作者 |坛友微信交流群
再试一下这个:
  1. proc sort data=b;
  2.         by var country_id startyear;
  3. run;
  4. data b0;
  5.         set b;
  6.         by var country_id startyear;
  7.         if first.country_id;
  8. run;
  9. proc sort data=b0;
  10.         by var startyear country_id;
  11. run;
  12. data b1;
  13.         set b0;
  14.         by var startyear country_id;
  15.         if first.var then n=0;
  16.         n+1;
  17.         if last.startyear;
  18.         drop country_id;
  19. run;
  20. data  b2;
  21.         set b1;
  22.          by var startyear;
  23.          ncount=lag(n);
  24.      if first.var then ncount=0;
  25.          drop n;
  26. run;
  27. proc sort data=a;
  28.         by var startyear;
  29. run;
  30. data result;
  31.         merge a(in=a) b2(in=b);
  32.         by var startyear;
  33.         if a;
  34.         if b=0 then ncount=0;
  35.         label ncount='其他出口国家数目';
  36. run;
复制代码
已有 1 人评分论坛币 热心指数 收起 理由
admin_kefu + 20 + 2 热心帮助其他会员

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

使用道具

13
liuliuqiu 发表于 2016-8-5 12:23:22 |只看作者 |坛友微信交流群
learsaas 发表于 2016-8-5 11:00
再试一下这个:
非常感谢!我刚核对了数据,大部分结果都是对的,只有一小部分有点问题。
例如:企业1第一次对美国出口是2001年,但出口一段时间后退出,第二次进入是2005年。分别统计2001和2005年进入前对多少国家出口。现在的程度能正确统计第一次进入的情况,但第二次甚至更多次进入时的统计结果有误差。
a     var   country    startyear
       1     美国        2001
       1     美国        2005
b    var    country     startyear
       1       新加坡         2002
       1        香港            2000
       1      澳大利亚       2003
       1      泰国            2006
       1      美国            2001
result  var    country     startyear   number
          1     美国        2001          1
          1     美国        2005           3
辛苦您!

使用道具

14
learsaas 发表于 2016-8-5 14:38:32 |只看作者 |坛友微信交流群
你最好把你原始数据贴出来

使用道具

15
liuliuqiu 发表于 2016-8-5 14:58:57 |只看作者 |坛友微信交流群
learsaas 发表于 2016-8-5 14:38
你最好把你原始数据贴出来
老师,您好,由于数据量过大,我只把一小部分数据贴出来了。
大体意思是在a数据集中增加一个变量number,这个变量描述了a和b相同var,不同country,且a中startyear大于b中startyear的个数。谢谢您啦! a.xlsx (339.73 KB) b.xlsx (356.88 KB)

使用道具

16
吕小布韦 发表于 2016-8-6 04:48:25 |只看作者 |坛友微信交流群
a和b的区别没有说,我理解是这样的,对于a中的一条记录,比如 企业=1, 国家=2, startyear=2011, 在b中找到所有企业=1, startyear<2011的记录, 然后统计这里面所有的国家数. 程序如下:

  1. proc sql;
  2. create table temp1 as select a.*, b.country from a left join b
  3. on a.id=b.id and a.startyear>b.startyear;
  4. create table temp2 as select id, count(distinct country) from temp1 group by id;
  5. quit;
复制代码


id是企业号
已有 1 人评分论坛币 热心指数 收起 理由
admin_kefu + 20 + 2 热心帮助其他会员

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

使用道具

17
liuliuqiu 发表于 2016-8-7 09:37:50 |只看作者 |坛友微信交流群
吕小布韦 发表于 2016-8-6 04:48
a和b的区别没有说,我理解是这样的,对于a中的一条记录,比如 企业=1, 国家=2, startyear=2011, 在b中找到所 ...
谢谢您!a和b的区别:a仅关注了企业对特定国家的一些出口,而b包括了企业对所有国家的数据,所以b包含了a中所有数据,想统计的是,a中企业对所关注国家出口前,对几个国家出口国。也就是说,统计a、b相同var,不同country,且a.startyear>b.startyear的个数。得到的结果样本量应该跟a中的样本量相同,但现在得到的结果不大对。能否再帮我看一看,谢谢您啦

使用道具

18
yongyitian 发表于 2016-8-7 11:15:39 |只看作者 |坛友微信交流群
下面结果中, 同一产品(var)第二次进入到同一国家(country)时 n 的值(n=4) 要减去第一次进入时 n 的值 (n=1)

data a;
input var  country   startyear;
datalines;
   1       1         2001
   1       1         2005
; run;
data b;
input var     country_id   startyear;
datalines;
     1        2          2002
     1        3          2000
     1        4          2003
     1        5          2006
     1        1          2001
; run;

proc sql;
   select distinct a.var, a.country, a.startyear, count(b.country_id) as n
   from a left join b
   on  a.var=b.var  and  a.startyear > b.startyear
   group by a.var, a.country,  a.startyear;
quit;

/* result

var   country   startyear   n
1       1           2001       1
1       1           2005       4  

*/

使用道具

19
jj.ma 发表于 2016-8-9 06:09:26 |只看作者 |坛友微信交流群
试试这个:

proc sql; /*compare first*/
create table avb1 as
select * from a left join (select country_id, startyear as year from b)
on a.var=b.var where year lt startyear;
quit;

proc sql; /*count countris*/
create table avb2 as
select var, country, startyear, count(country_id) as countris from avb
group var, country;
quit;

proc sort data =avb2 noduprecs out=result; /*list result*/
   by var country;
run;
已有 1 人评分论坛币 热心指数 收起 理由
admin_kefu + 20 + 2 热心帮助其他会员

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

使用道具

20
zwnSAS121 发表于 2017-1-14 23:10:14 |只看作者 |坛友微信交流群
  1. /*company1和company2中有id代表企业,country为出口的国家,startyear
  2. 为开始对该国出口的时间,想在a的基础上得到在a出口某个country之前,在b中
  3. 该企业有无出口其他国家的经历,并统计出出口国家的个数。

  4. 例如企业1391910,在a中,2009年开始向392出口,
  5. 再看b中2009年前该企业是否有出口其他国家的经历,
  6. 在b中,该企业2007年和2008年分别开始出口842和410国家,
  7. 则有出口经验,且有两个国家。依次类推。。。*/
  8. /*程序1*/

  9. /*增加标识变量*/
  10. data company1;
  11. set company1;
  12. group="A表";
  13. run;
  14. data company2;
  15. set company2;
  16. group="B表";
  17. run;

  18. /*安装id与开始出口年份降序排序*/
  19. proc sort data=company1 out=company1_1;by id startyear;run;

  20. /*取来自A表开始出口的最小年份*/
  21. data nodup_min_year;
  22. set company1_1;
  23. by id;
  24. if first.id;
  25. run;

  26. /*join内联查询按id并且按另一个变量条件筛选*/
  27. proc sql;
  28. create table test1 as
  29. select
  30. B.Id,
  31. B.country,
  32. B.startyear,
  33. B.group,
  34. A.startyear
  35. from nodup_min_year as A  /*原来A表去重并保留最小的出口年份*/
  36. join company2 As B /*原来表B*/
  37. On A.Id=B.Id /*取id相同的记录*/
  38. and B.startyear < A.startyear;
  39. /*按A、B表在相同的id下,B表年份小于A表年份的条件筛选*/
  40. Quit;/*test1表输出了来自B表满足年份条件的企业及出口国家*/

  41. proc freq data=test1;
  42. table id;/*id所对应的频数即是出口国家个数*/
  43. run;
复制代码

使用道具

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

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

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

GMT+8, 2024-4-27 09:17