【问题标题】:SAS-Creating Panel by several datasets多个数据集的 SAS-Creating Panel
【发布时间】:2017-12-30 00:09:26
【问题描述】:

假设有十个数据集结构相同:日期和价格,特别是它们具有相同的时间段但不同的价格

 date       price
 20140604    5
 20140605    7
 20140607    9

我想组合它们并创建一个面板数据集。由于每个数据集中没有名称,我尝试在每个数据中添加一个新变量name,然后将它们组合起来。

以下代码用于将name变量添加到每个数据集中

%macro name(sourcelib=,from=,going=); 
proc sql noprint;  /*read datasets in a library*/
  create table mytables as
  select *
  from dictionary.tables
  where libname = &sourcelib
  order by memname ;

  select count(memname) 
  into:obs 
  from mytables;

  %let obs=&obs.;

  select memname
  into : memname1-:memname&obs.
  from mytables;
quit;

  %do i=1 %to &obs.;

  data 
  &going.&&memname&i;
  set
  &from.&&memname&i;
 name=&&memname&i;
  run;
%end;
%mend;

那么,这个策略正确吗?是否有不同的方法来创建面板数据?

【问题讨论】:

    标签: sas panel


    【解决方案1】:

    实际上有两种方法可以设置重复测量数据。您可以使用代码将创建的 TALL 方法。这通常是最灵活的。另一种是宽格式,每个 PRICE 都存储在不同的变量中。这通常不太灵活,但对于某些分析来说可能更容易。

    您可能不需要使用宏代码甚至代码生成来组合 10 个数据集。您可能会发现只输入 10 个数据集名称比编写复杂的代码从元数据中提取名称更容易。因此,像这样的数据步骤将允许您在 SET 语句中列出任意数量的数据集,并将成员名用作区分源数据集的新 PANEL 变量的值。

    data want ;
      length dsn $41 panel $32 ;
      set in1.panel1 in1.panela in1.panelb indsname=dsn ;
      panel = scan(dsn,-1,'.') ;
    run;
    

    如果您的数据集名称遵循可用作 SET 语句中的成员列表的模式,则代码更容易编写。因此,您可以拥有一个带有数字后缀的名称列表。

      set in1.panel1-in1.panel10 indsname=dsn ;
    

    或者可能都是以特定前缀开头的名称。

      set in1.panel:  indsname=dsn ;
    

    如果不同的面板用于相同的日期,那么宽格式可能更容易?然后,您可以按 DATE 合并数据集并重命名各个 PRICE 变量。即生成如下所示的数据步骤:

    data want ;
       merge in1.panel1 (rename=(price=price1))
             in1.panel2 (rename=(price=price2))
             ...
       ;
       by date;
    run;
    

    或者,将 BY 语句添加到创建 TALL 数据集的数据集然后将其转换为 WIDE 格式可能会更容易。

    data tall;
      length dsn $41 panel $32 ;
      set in1.panel1 in1.panela in1.panelb indsname=dsn ;
      by date ;
      panel = scan(dsn,-1,'.') ;
    run;
    proc transpose data=tall out=want ;
      by date;
      id panel;
      var price ;
    run;
    

    【讨论】:

      【解决方案2】:

      这是实现您的目标的有效方式。

      您将需要 2 个 .library.data 语法的宏之间。第一个. 用于连接。第二个显示为.

      我假设您希望将所有这些数据集附加在一起。你可以添加

      data &going..want;
      set
        %do i=1 %to &obs;
            &from..&&memname&i
        %end;
      ;
      run;
      

      您可以像这样组合添加名称和数据步骤的循环:

      data &going..want;
      set
        %do i=1 %to &obs;
            &from..&&memname&i (in=d&i)
        %end;
      ;
      %do i=1 %to &obs;
         if d&i then
            name = &&memname&i;
      %end;
      run;
      

      【讨论】:

        【解决方案3】:

        我无法评论 SQL 代码,但策略是正确的。为每个数据集添加一个名称,然后使用 PANELBY 语句对名称进行面板。

        【讨论】:

          猜你喜欢
          • 2017-03-26
          • 1970-01-01
          • 2015-08-19
          • 1970-01-01
          • 2012-06-13
          • 2014-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多