早上好!
我有情况需要帮助。
我有一个包含 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;
但实际上,数组具有动态维度。这是第一个错误,然后我不知道如何将变量与数组连接,然后更改其值。
我需要帮助!或一些逻辑澄清。
非常感谢您的任何意见和想法!
赞赏! 林
该项目不需要生成代码。您可以使用 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;
首先最好使用
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;