SAS 扫描变量的标签,然后更改变量的值

问题描述 投票:0回答:2

早上好!

我有情况需要帮助。

我有一个包含 300 个变量的数据集,几乎所有变量都是数字变量。数据源是 Excel 电子表格。电子表格中大约有 100 个变量,类似于“百分比......”或“......百分比......”。

但是该值不是十进制,而是乘以 100 后的数值。我需要将该值更改为小数。例如,现在数据集中的值为 53,但实际上,它是 0.53。

我的想法是首先扫描变量的标签,如果有“Percent”或“percent”,如果有,则将此变量存储在数组中。然后有一个 do 循环来读取数组并除以 100 来更改相应的值。

我的代码如下:

 proc contents data=dataset1 noprint out=__cont;
   run;

   proc sql;
    select count(libname) into: maxcount
    from __cont
    ;
   quit;

   %put &maxcount;

   data output;
    set __cont;
    array percentvar{&maxcount} $;
    do i=1 to &maxcount;
        if scan(upcase(label), 'PERCENT')>1 then percentvar(i)=name;
    end;
    drop i;
   run;

但实际上,数组具有动态维度。这是第一个错误,然后我不知道如何将变量与数组连接,然后更改其值。

我需要帮助!或一些逻辑澄清。

非常感谢您的任何意见和想法!

赞赏! 林

arrays variables sas macros
2个回答
0
投票

该项目不需要生成代码。您可以使用 VLABEL() 函数来查找标签。

data output;
  set dataset1 ;
  array nums _numeric_;
  do index=1 to dim(nums);
    if findw(vlabel(nums[index]),'percent',,'i') then 
      nums[index]=nums[index]/100 
    ;
  end;
  drop index;
run;

0
投票

首先最好使用

CALL VNAME
例程将变量名称分配给数组元素,并尝试使用
do over
语句来迭代数组中的所有变量
percentvar
,所以在这种情况下我将使用
index
函数检查变量名称是否包含单词“Percent”(不区分大小写),如果包含,我会将变量值除以 100 以将其转换为小数。

看看这个:

proc contents data=dataset1 noprint out=__cont;
run;

proc sql;
    select count(libname) into: maxcount
    from __cont;
quit;

%put &maxcount;

data output;
    set __cont;
    array percentvar{&maxcount} $20. _temporary_;
    do i=1 to &maxcount;
        percentvar(i) = call vname(percentvar(i));
    end;
    drop i;
run;

data dataset1;
    set dataset1;
    array percentvar(*) &percentvar.;
    do over percentvar;
        if index(upcase(vname(percentvar)), 'PERCENT') > 0 then percentvar = percentvar / 100;
    end;
run;
© www.soinside.com 2019 - 2024. All rights reserved.