【问题标题】:SAS dynamic variable names from other variables来自其他变量的 SAS 动态变量名称
【发布时间】:2013-04-18 18:05:29
【问题描述】:

我正在尝试根据其他变量中包含的数据创建 SAS 变量名称。例如,我可以从

Obs  Var1  Var2
  1   abc     X
  2   def     X
  3   ghi     Y
  4   jkl     X

我想结束

Obs  Var1  Var2    X    Y
  1   abc     X   abc   
  2   def     X   def   
  3   ghi     Y        ghi
  4   jkl     X   jkl   

我确实有一种方法可以做到这一点,但它需要一些丑陋的宏来首先创建所需的变量(使用长度语句),然后创建一系列编号的宏变量(每个观察 1 个),这些变量随后在数据步循环。它可以工作,但很复杂,我认为不能很好地扩展到真实数据,其中每行包含多个用于创建的变量,以及几千行。

我也尝试过使用数组——将变量名称保存在宏 var 中,使用它来生成数组语句,并尝试跟踪每个新变量需要哪个数组索引,但这也很复杂。

真正有用的是类似于

vvaluex(var2)=var1

除了 vvaluex 不能在等号的左边。有什么想法或想法吗?

【问题讨论】:

    标签: variables sas names


    【解决方案1】:

    PROC TRANSPOSE 是处理问题中示例的便捷方式。

    data have;
    input Obs  Var1 $  Var2 $;
    datalines;
    1   abc     X
    2   def     X
    3   ghi     Y
    4   jkl     X
    ;;;;
    run;
    
    proc transpose data=have out=want;
    by obs;
    id var2;
    var var1;
    copy var1 var2;
    run;
    

    另一个选项可能与您之前尝试过的类似,使用数组和 VNAME:

    proc sql;
    select var2 into :var2list separated by ' ' from have;
    quit;
    
    data want;
    set have;
    array newvars $ &var2list;
    do _t = 1 to dim(newvars);
      if vname(newvars[_t]) = Var2 then do;
        newvars[_t] = var1;
        leave;
      end;
    end;
    run;
    

    PROC TRANSPOSE 应该更快,并且可能更灵活,但这可能对某些目的更有效。

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多