如何使用SAS计算二维上的不同值

如何使用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; 我的问题是如何计算每个国家不同的公司年数。基本上,我想知道在不同的年份有多少不同

我有一个如下所示的数据集。此数据集包含四个变量国家名称国家、公司ID公司、年份和日期

我知道如何计算每个国家不同公司的数量。我是用下面的代码做的

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;