a 和b 中有 var代表企业,country为出口的国家,startyear为开始对该国出口的时间,想在a的基础上得到在a出口某个country之前,该企业有无出口其他国家的经历,并统计出出口国家的个数。例如企业1391910,在a中,2009年开始向392出口,则看2009年前,该企业是否有出口其他国家的经历,在b中,企业2007年和2008年分别开始出口842和410国家,则有出口经验,且有两个国家。依次类推。。。
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;
非常感谢!我刚核对了数据,大部分结果都是对的,只有一小部分有点问题。
例如:企业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
辛苦您!
下面结果中, 同一产品(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;
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;