【问题标题】:variable value as part of variable name变量值作为变量名的一部分
【发布时间】:2021-09-21 10:50:08
【问题描述】:

问题很简单,希望也有答案。

有没有办法(调用执行、宏、symput 等)重写以下代码以使其更强大,以一种好的方式使用 SAS?

data get;
    set have; 
    by pid year;
    if first.year then do;
        if      year = 2017 then f2017 = 1;
        else if year = 2018 then f2018 = 1;
        else if year = 2019 then f2019 = 1;
    end;
run;

这是一个尝试,但它不起作用:

data _null_;
    set have end=last; 
    if _n_ = 1 then call execute('data get;set have;by pid year; ');
    call execute(cats('if first.year then f',year,'=1;'));
    if last then call execute('run;');

run;

【问题讨论】:

  • 为什么会有 BY 语句和 FIRST.YEAR?请显示一些示例输入和输出数据集,以显示您实际尝试进行的转换。您确定不想使用 PROC TRANSPOSE?

标签: sas sas-macro


【解决方案1】:

使用特定索引对上述数组解决方案的变化。

data want;
    set have;
    array f[2017:2020] f2017-f2020;


    f(year) = 1;

run;

【讨论】:

    【解决方案2】:

    如果您的变量都是按顺序排列的,请使用数组使用快捷方式自动创建变量:

    var<min> - var<max>

    例如,var1-var4 会自动解释为 var1 var2 var3 var4

    使用新变量的实际名称与年份进行比较。下面的代码为每年创建一个以f 为前缀的二进制 1/0 变量。

    简单回答

    data want;
        set have;
        array f[*] f2017-f2020;
    
        /* Grab the year part of the variable name and compare it to the year. */
        do i = 1 to dim(f);
            f[i] = ( input(substr(vname(f[i]), 2), 4.) = year );
        end;
    
        drop i;
    run;
    

    输出:

    year    f2017   f2018   f2019   f2020
    2017    1       0       0       0
    2018    0       1       0       0
    2019    0       0       1       0
    2020    0       0       0       1
    

    更动态的版本

    如果您需要使其更具动态性,可以从宏变量中读取最小/最大年份。例如:

    proc sql noprint;
        select min(year)
             , max(year)
        into :min_year
           , :max_year
        from have
        ;
    quit;
    
    data want;
       set have;
       array f[*] f&min_year. - f&max_year.;
       ...
    

    更动态的版本

    如果您真的需要动态,您可以将每个值读入以空格分隔的宏变量列表。单个宏变量最多可包含 65,534 个字符,因此您有足够的空间来添加变量。

    proc sql noprint;
        select distinct cats('f', year)
        into :values separated by ' '
        from have
        ;
    quit;
    
    data want;
       set have;
       array f[*] &values.;
       ...
    

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多