【问题标题】:SAS Data Step / Pointer / Indirect Variable AssignmentSAS 数据步/指针/间接变量赋值
【发布时间】:2026-02-17 19:05:01
【问题描述】:

在 SAS 数据步骤中,我有一个名为“varName”的字符变量。此变量存储另一个变量的名称。在下面的示例中,它存储了数字变量“changeMe”的名称:

data TMP;
   length
      varName $32
      changeMe 8
      ;
   varName = ‘changeMe’;
   /*??? How to change the content of variable that varName holds ???*/
run;

现在的问题是:如何更改 varName 持有的变量的内容?

用例是 varName 充当一个动态指针,指向我想在大型 SAS 数据集中操作的不同变量。

【问题讨论】:

  • 看起来你有一个交易文件。查看 UPDATE 语句。你也有文本文件中的数据吗?查看命名的输入样式。 documentation.sas.com/…我们曾经用它来创建交易数据集。

标签: sas


【解决方案1】:

DATA 步不直接提供命名间接赋值。

在某些情况下,间接分配要求可能表明您要执行Proc TRANSPOSE 数据转换。如果在事务数据集中提供了变量名称和值,并且数据具有BY 组变量,则更好的解决方案可能是TRANSPOSE 事务数据并使用UPDATE 将该转换合并到主数据或MODIFY 声明。

无论如何,您都可以对给定类型的变量进行数组化并迭代数组以查找需要赋值的目标。

例子:

data want;
  set sashelp.class;

  varname = 'name';
  varvalue = 'Scooter';

  array chars _character_;

  do _n_ = 1 to dim(chars);
    if upcase (vname(chars(_n_))) = upcase(varname) then do;
      chars(_n_) = varvalue;
    end;
  end;
run;

输出

【讨论】:

    【解决方案2】:

    call execute() 是一个高度可行的解决方案。

    data TMP;
       length
          varName $32
          changeMe 8
          ;
       varName = 'changeMe';
    run;
    
    data _null_;
      set TMP end=eof;
    
      if _n_ = 1 then call execute('data %trim(&syslast.); modify %trim(&syslast.);');
      call execute(cats(varName)||' = rand("uniform",1,0);');
      if eof then call execute('run;');
    run;
    

    日志:

    NOTE: CALL EXECUTE generated line.
    1   + data WORK.TMP; modify WORK.TMP;
    2   + changeMe = rand("uniform",1,0);
    3   + run;
    
    NOTE: There were 1 observations read from the data set WORK.TMP.
    NOTE: The data set WORK.TMP has been updated.  There were 1 observations rewritten, 0 observations
          added and 0 observations deleted.
    

    【讨论】: