代码之家  ›  专栏  ›  技术社区  ›  78282219

sas:set语句点=\n_

  •  1
  • 78282219  · 技术社区  · 7 年前

    我在试着理解一个朋友的代码,看看是否能为我的论文找到一些灵感。他运行一个部分,在那里他创建一个数据集并输入3个数据集。然而,我不明白的是,他使用了3个set语句,后一个数据集使用point=“n uu”

    以下代码的用途是什么?

            data Other;
                set One;
                set Two point = _N_;
                set Three point = _N_;
                array Rating[*] Unrated;
                array Amortising[*] '1'n;
                array Rating_old[*] old_Unrated;
                AM = 0;
                do i = 1 to dim(Rating);
                    Rating[i] = Rating[i] + Rating_old[i] * Amortising[i];
                end;
            run;
    

    输入数据集如下所示

    data one;
    input Segment count weight ;
    datalines;
    1 0 0.1
    99 1 0.2
    ;
    run;
    
    data two;
    input block $ type '0'n '1'n '99'n;
    datalines;
    50 A 100% 10% 0%
    50 S 100% 10% 0%
    51 S 100% 10% 0%
    52 S 100% 10% 0%
    132 S 100% 12% 0%
    ;
    run;
    
    data three;
    input DPD $ block type $ segment count weight;
    datalines;
    AM 50 S 1 0 0.1
    Unrated 51 S 99 0.2
    NPE 132 S 1 0.5
    ;
    run;
    

    只是想看看这一点=uun_uuu将用于什么目的!

    2 回复  |  直到 7 年前
        1
  •  1
  •   Tom    7 年前

    在这个程序中,它什么也不做。在最后两个set语句中,如果没有point=选项,程序将运行完全相同。

    这个 POINT= 让我们直接访问观察结果。这个 _N_ 对于数据步骤的每次迭代,自动变量都会增加一次。因此,在第一次迭代中,步骤将从三个输入中的每一个读取第一次观察结果。如果没有point=选项的话,就会发生这种情况。

    请注意,当第一个set语句读取超过文件结尾时,该程序将停止。如果不使用point=则当三个set语句中的任何一个试图读取超过输入文件末尾时,它将停止。您也可以这样做,并通过使用和测试nobs=选项来避免SAS日志中的错误。

    set One;
    if _n_ <= nobs2 then set Two nobs=nobs2;
    if _n_ <= nobs3 then set Three nobs=nobs3;
    
        2
  •  1
  •   Joe    7 年前

    鉴于显示的数据集,它不做任何事情。

    但是,如果 ONE 数据集的行数超过了其他两个数据集中的一个或两个,这样可以避免数据步骤在最短数据集的行数用完时停止。例如,运行以下命令:

      data Other;
            set Two;
            set One point = _N_;
            set Three point = _N_;
            array Rating[*] Unrated;
            array Amortising[*] '1'n;
            array Rating_old[*] old_Unrated;
            AM = 0;
            do i = 1 to dim(Rating);
                Rating[i] = Rating[i] + Rating_old[i] * Amortising[i];
            end;
        run;
    

    只是交换了两个和一个。现在你有5排,而如果你把 point=_n_ 你只剩下两个了。所以这个程序很可能是为了确保 的行被表示出来(类似于SQL中的左联接,但此处不联接任何内容)。这可能更清楚地写为 merge ,即使没有 by 语句,如果它只是一对一的合并。不过,通常有一个有效的合并键可以合并。

    推荐文章