楼主: liuliuqiu
3220 22

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

  • 6关注
  • 2粉丝

已卖:35份资源

副教授

64%

还不是VIP/贵宾

-

威望
0
论坛币
2239 个
通用积分
8.1161
学术水平
3 点
热心指数
5 点
信用等级
5 点
经验
14393 点
帖子
429
精华
0
在线时间
1129 小时
注册时间
2009-3-24
最后登录
2025-12-11

楼主
liuliuqiu 发表于 2016-8-4 11:51:35 |AI写论文
15论坛币
a   
varcountrystartyear

1391910

392

2009

1392010

410

2008

1392061

392

2007

1392061

842

2009

1392321

842

2009

1392390

842

2009

1852990

158

2008

1852990

344

2009

1900120

344

2008

1900120

392

2009

1900120

410

2008

b
varcountry_idstartyear

1391910

392

2009

1391910

410

2008

1391910

842

2007

1392010

410

2008

1392010

392

2007

1392010

410

2009

1392061

392

2007

1392061

842

2009

1392321

842

2009

1392390

842

2009

1852990

158

2008

1852990

344

2009

1900120

344

2008

1900120

392

2009

1900120

410

2008

1900120

528

2004

1900120

458

2001

1900120

484

2003

a 和b 中有 var代表企业,country为出口的国家,startyear为开始对该国出口的时间,想在a的基础上得到在a出口某个country之前,该企业有无出口其他国家的经历,并统计出出口国家的个数。例如企业1391910,在a中,2009年开始向392出口,则看2009年前,该企业是否有出口其他国家的经历,在b中,企业2007年和2008年分别开始出口842和410国家,则有出口经验,且有两个国家。依次类推。。。




最佳答案

吕小布韦 查看完整内容

改了下, 应该没问题了
关键词:Country starty Count Start year country

回帖推荐

zwnSAS121 发表于22楼  查看完整内容

沙发
吕小布韦 发表于 2016-8-4 11:51:36
liuliuqiu 发表于 2016-8-7 09:37
谢谢您!a和b的区别:a仅关注了企业对特定国家的一些出口,而b包括了企业对所有国家的数据,所以b包含了a ...
  1. proc sql;
  2. create table temp1 as select a.*, b.country as country_before from a left join b
  3. on a.id=b.id and a.startyear>b.startyear;
  4. create table temp2 as select id,startyear, count(distinct country_before) from temp1 group by id,startyear;
  5. quit;
复制代码
改了下, 应该没问题了

藤椅
liuliuqiu 发表于 2016-8-4 13:02:01
各位帮帮忙呀

板凳
wwang111 发表于 2016-8-4 13:11:52
跟刚才的程序差不多,只加了一个是否是‘其他’国家的识别,你看一下哪里还有问题:

data test;
set a;
  ex=0;
  exnumber=0;
do i=1 to nobs;
set b(rename=(var=var1 startyear=startyear1)) nobs=nobs point=i;
if var=var1 and startyear>startyear1 and country ne country_id then do;
   ex=1;
   exnumber+1;
end;
end;
drop startyear1 var1 country_id;
run;

报纸
liuliuqiu 发表于 2016-8-4 13:25:02
wwang111 发表于 2016-8-4 13:11
跟刚才的程序差不多,只加了一个是否是‘其他’国家的识别,你看一下哪里还有问题:

data test;
谢谢您,但数据量在400百万+,一直运行不出来,有没有稍简单点的呢?

地板
wwang111 发表于 2016-8-4 13:34:34
liuliuqiu 发表于 2016-8-4 13:25
谢谢您,但数据量在400百万+,一直运行不出来,有没有稍简单点的呢?
我感觉用双set语句已经是效率很高的了,至于有没有效率更高的方法,我也不是很确定,你可以咨询一下论坛里的大牛们;
貌似可以用declare hash实现,但是我不会,以前看其他人发帖子好像有用这种方法解决类似问题的,仅供参考。

7
liuliuqiu 发表于 2016-8-4 17:46:11
wwang111 发表于 2016-8-4 13:34
我感觉用双set语句已经是效率很高的了,至于有没有效率更高的方法,我也不是很确定,你可以咨询一下论坛里 ...
非常感谢!!

8
learsaas 发表于 2016-8-4 19:21:35
试试这个:
  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. proc sort data=a;
  21.         by var startyear;
  22. run;
  23. data result;
  24.         merge a(in=a) b1(in=b);
  25.         by var startyear;
  26.         if a;
  27.         if b=0 then n=0;
  28.         label n='其他出口国家数目';
  29. run;
复制代码

9
liuliuqiu 发表于 2016-8-4 20:34:05
learsaas 发表于 2016-8-4 19:21
试试这个:
谢谢您!运算的非常快。但结果好像有点问题。假如:
a var  country   startyear
   1       1         2005
   1       2         2007
   1       3         2008
b  var     country   startyear
     1         1          2005
      1        2           2007
     1        3            2008
     1         4          2003
     1         5          2007
     1         6          2008
结果:a中第一条记录,找2005年前企业1出口的国家数(数据集b中:1         4          2003),a中第二条记录,找2007年前企业出口的国家数(数据集b中有2条记录),依次类推
var  country   startyear    n
   1       1         2005     1
   1       2         2007     2
   1       3         2008     4

10
liuliuqiu 发表于 2016-8-4 20:34:41
learsaas 发表于 2016-8-4 19:21
试试这个:
能否辛苦您再帮忙看看,非常感谢

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-28 14:22