如何使用SAS计算二维上的不同值
我有一个如下所示的数据集。此数据集包含四个变量国家名称国家、公司ID公司、年份和日期 我知道如何计算每个国家不同公司的数量。我是用下面的代码做的如何使用SAS计算二维上的不同值,sas,Sas,我有一个如下所示的数据集。此数据集包含四个变量国家名称国家、公司ID公司、年份和日期 我知道如何计算每个国家不同公司的数量。我是用下面的代码做的 proc sql; create table lib.count as select country, count(distinct company) as count from lib.data group by country; quit; 我的问题是如何计算每个国家不同的公司年数。基本上,我想知道在不同的年份有多少不同
proc sql;
create table lib.count as
select country, count(distinct company) as count
from lib.data
group by country;
quit;
我的问题是如何计算每个国家不同的公司年数。基本上,我想知道在不同的年份有多少不同的公司或相同的公司。如果同一公司在同一年有两个观察值,我想将其计算为1个不同的值。如果同一家公司在不同的年份有两个观测值,我想把它算作两个不同的值。我希望每个国家的输出如下所示:
Country No. firm_year
A 2
B 1
C 1
有人能教我怎么做吗 第一个问题的答案是:
data lib.count(keep=country companyCount);
set lib.data;
by country;
retain companyList '';
retain companyCount 0;
if first.country then do;
companyList = company;
companyCount = 1;
end;
else do;
if ^index(companyList, company) then do;
companyList = cats(companyList,',',company);
companyCount + 1;
end;
end;
if last.country then output;
run;
结果是:
Country companyCount
------- ------------
A 2
B 1
C 1
同样,您将计算每个国家不同的公司年数。第一个问题的答案是:
data lib.count(keep=country companyCount);
set lib.data;
by country;
retain companyList '';
retain companyCount 0;
if first.country then do;
companyList = company;
companyCount = 1;
end;
else do;
if ^index(companyList, company) then do;
companyList = cats(companyList,',',company);
companyCount + 1;
end;
end;
if last.country then output;
run;
结果是:
Country companyCount
------- ------------
A 2
B 1
C 1
同样地,你将计算每个国家不同的公司年数。我想我对你期望的结果有点困惑。下面是一个sql方法,它得到的结果与到目前为止另一个答案发布的结果相同
data temp;
attrib Country length = $10;
attrib Company length = $10;
attrib Year length = $10;
attrib Date length = $10;
input Country $ Company $ Year $ Date $;
infile datalines delimiter = '@';
datalines;
A@1@x@x1@
A@1@x@x2@
B@2@x@x1@
C@3@x@x3@
;
run;
proc sql;
create table temp2 as
select country, count(distinct Date) as count
from temp
group by country, company;
quit;
我想我对你期望的结果有点困惑。下面是一个sql方法,它得到的结果与到目前为止另一个答案发布的结果相同
data temp;
attrib Country length = $10;
attrib Company length = $10;
attrib Year length = $10;
attrib Date length = $10;
input Country $ Company $ Year $ Date $;
infile datalines delimiter = '@';
datalines;
A@1@x@x1@
A@1@x@x2@
B@2@x@x1@
C@3@x@x3@
;
run;
proc sql;
create table temp2 as
select country, count(distinct Date) as count
from temp
group by country, company;
quit;
一个快速的方法是连接所有要比较的变量,创建一个新变量。比如:
data data_mod;
set data;
length company_year $ 20;
company_year= cats(company,year);
run;
然后,您可以使用countdistinct company_year运行proc sql。一个快速方法是连接所有要比较的变量,创建一个新变量。比如:
data data_mod;
set data;
length company_year $ 20;
company_year= cats(company,year);
run;
然后您可以使用countdistinct company_year运行proc sql。您需要嵌套查询,正如@DaBigNikoladze所暗示的那样 内部查询,将生成国家/地区+公司+年份的不同组合列表; 一个外部查询,它将计算每个国家/地区在内部查询中的行数。 生成数据集 执行查询 后果
正如@DaBigNikoladze所暗示的,您需要嵌套查询 内部查询,将生成国家/地区+公司+年份的不同组合列表; 一个外部查询,它将计算每个国家/地区在内部查询中的行数。 生成数据集 执行查询 后果
如果您喜欢更紧凑的语法,您可以将中间步骤添加为proc sql的子查询。如果您喜欢更紧凑的语法,您可以将中间步骤添加为proc sql的子查询。您的输出数据集不应该是基于输入数据集的B C/2 1 1吗?你从哪里得到这些值?谢谢你提醒我。你说得对,我刚记下了数字A为什么有3年的固定年资?我只看到两个:2000和2001难道你的输出数据集不是基于你的输入数据集的B C/2 1吗?你从哪里得到这些值?谢谢你提醒我。你说得对,我刚记下了数字A为什么有3年的固定年资?我只看到两个:2000年和2001年
proc sort data=lib.data out=temp nodupkey;
by country company year;
run;
data firm_year(keep=country cnt_fyr);
set out;
by country company year
retain cnt_fyr;
if first.country then cnt_fyr=1;
else cnt_fyr+1;
if last.country;
run;