【问题标题】:SAS: Apparent Symbolic reference not resolved with call symptuxSAS:表观符号引用未通过调用 symptux 解析
【发布时间】:2016-12-07 10:59:13
【问题描述】:

我有一个数据集如下:

ID Value
A 77
B 60
C 20
D 40
E 60
F 100

我还有另一个包含 6 个变量的数据集,比如说

A1 - A6

我想将上面的值乘以 A1-A6

比如 A1*A 的值 A2*B 的值

所以我是这样创建的

data _null_ ; 
set have; 

call symputx('value' || trim(left(_n_)),value); 
call symputx('rows', _n_);

运行;

data want; 
set have; 

array XX(*) A1 - A6; 
    do i=1 to &rows; 
        XX(i)=mgpc(i)* &&value&i ;
    end;
run;

但是当我运行它时它说

Apparent symbolic reference i not allowed. 
WARNING: Apparent symbolic reference VALUE not resolved.
WARNING: Apparent symbolic reference I not resolved.
ERROR 22-322: Syntax error, expecting one of the following:
          a name, a quoted string, a numeric constant,
          a datetime constant, a missing value, INPUT,
          PUT.

【问题讨论】:

  • 您的数组语句是否与您的调用符号在同一步骤中?
  • 不,两者都在单独的数据步骤中
  • 请发布导致此错误消息的代码的minimal, complete and verifiable 示例。
  • 好的,我编辑了问题

标签: macros sas


【解决方案1】:

试试这个:

data want; 
set have; 
array XX(*) A1 - A6; 
    do i=1 to &rows; 
        value=symget(cats('value',i));
        XX(i)=mgpc(i)* value;
    end;
run;

【讨论】:

  • 这是一个了不起的功能@Shenglin Chen,非常感谢。
【解决方案2】:

如果要引用数据集变量,为什么要使用宏变量?

因此,您有一个数据集,我们将其称为 REFERENCE_TABLE,其中包含变量 VALUE,并且您希望将当前数据集中的某个数字与该参考数据集中的第 I 条记录相乘。在 SET 语句中使用 POINT= 选项。

假设您有一个数据集 MYDATE,其中包含以字母 X 开头的变量数组,并且您想要找到 X(i)*REFERENCE_VALUE(i) 的总和。

data want ;
  set mydata ;
  array x x: ;
  total=0
  do i=1 to min(dim(x),nobs);
    set reference_table point=i nobs=nobs ;
    total = sum(total,x(i)*value);
  end;
run;

您还可以通过使用IF _N_= THEN DO; 代码块将值加载到数组或哈希对象中来提高效率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2010-09-30
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多