【问题标题】:Merging datasets based on 2 variables in SAS基于 SAS 中的 2 个变量合并数据集
【发布时间】:2012-10-21 16:36:58
【问题描述】:

我正在使用不同的数据库。所有这些都包含有关 1000 多家公司的信息。公司由其股票代码(通常在股票报价板上看到的名称的简称(即福特为 F))定义。

除了要合并的股票代码之外,我还必须在时间上合并。我在整个时间序列中使用月份作为计数变量。最终的目的是在这种情况下进行回归

Y(jt) = c + X(jt) +X1(jt) 等与j = company(股票代码)和t = time(月)。

假设我有 2 个数据库,其中一个是基础数据库,其中包含变量,例如股票代码、月份、公司的 beta(风险度量)等,第二个数据库具有额外变量(假设是市值) .

然后我想做的是根据股票代码和月份合并这两个数据库。

示例:基础数据库:

代码 ____ 月 ____ 测试版 AA ____ 4 ____ 1.2 BB ____ 8 ____ 1.18

第二个数据库:

代码 ____ 月 ____ MCAP AA ____ 4 ____ 8542 BB ____ 6 ____ 1245

然后合并后我想要这样的东西:

代码 ____ 月 ____ 测试版 ____ MCAP AA ____ 4 ____ 1.2 ____ 8542

因此,必须删除与日期和股票代码都不匹配的所有观察结果。我确信这是可能的,只是找不到正确的代码类型。

PS:我猜下划线与字体布局有关,但粗体和斜体都应该是正常的:)

【问题讨论】:

    标签: database variables merge sas


    【解决方案1】:

    同意乔纳森的观点......在按股票代码和时间独立对两个数据集进行排序之后,我将使用合并的数据步骤.....稍作修改

    data want; 
       merge base(in = b) mcap(in = m); 
       by ticker time;
       if m & b; 
    run;
    

    两个数据集中没有共同代码和时间的记录将被自动删除..

    【讨论】:

      【解决方案2】:

      调用base和mcap这两个数据集,假设它们都已经按照ticker和month排序,可以这样:

      data want;
        merge base(in = b)
              mcap(in = m);
        if m & b;
      run;
      

      子集 if 将不接受在 Bath 数据集中不匹配的任何行。

      【讨论】:

        【解决方案3】:

        好的,看来您可以通过以下方式轻松完成:

        proc sort data=work;
        by ticker month;
        run;
        proc sort data=wsize;
        by ticker month;
        run;
        data test;
        merge work(in=a) wsize(in=b);
        by ticker month;
        frommerg=a;
        fromwtvol=b;
        run;
        data test;
        set test;
        if frommerg=0 then delete;
        run;
        data test;
        set test;
        if fromwtvol = 0 then delete;
        run;
        data test;
        set test;
        drop frommerg fromwtvol;
        run;
        

        那是我使用的代码,我在发布之前尝试了这个,因为我不想看起来像一个 leecher,但碰巧我尝试的 2 个数据库没有共同点(70.000 次观察的几率是多少:D) ,我重试了它,它可以工作(现在!)

        还是谢谢!

        【讨论】:

        • 您可以将其重写为单个 proc sql 步骤。 Proc sql可以处理多对多的合并,数据步不能,而且合并前不必对数据集进行排序。
        【解决方案4】:
        proc sort data=database1;
        by ticker month;
        run;
        
        proc sort data=database2;
        by ticker month;
        run;
        data gh;
        merge database1(in=a) database2(in=b);
        by ticker month;
        if a and b;
        run;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-19
          • 2017-03-26
          相关资源
          最近更新 更多