提问人:Lin 提问时间:7/28/2023 更新时间:7/28/2023 访问量:51
SAS 扫描变量的标签,然后更改变量的值
SAS scan variable's label and then change the variable's value
问:
早上好!
我有一个需要帮助的情况。
我有一个包含 300 个变量的数据集,几乎所有变量都是数字变量。数据源是 Excel 电子表格。电子表格中大约有 100 个变量类似于“百分比......”或“......百分比......”。
但该值不是十进制,而是乘以 100 后的数值。我需要将该值更改为小数。例如,数据集中的值现在是 53,但实际上它是 0.53。
我的想法是,如果其中有“百分比”或“百分比”,首先扫描变量的标签,如果有,请将此变量存储在数组中。然后有一个 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;
但实际上,数组具有动态维度。这是第一个错误,然后我不确定如何将变量与数组连接,然后更改其值。
我需要帮助!或一些逻辑澄清。
非常感谢您的任何意见和想法!
赞赏! 林
答:
4赞
Tom
7/28/2023
#1
此项目无需生成代码。您可以使用 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赞
Lin
7/29/2023
嗨,汤姆,非常感谢您的编码!不知何故,该值不会更改为十进制。我还在看它。你有什么想法吗?
0赞
Tom
7/29/2023
确保您没有附加不显示小数位的 FORMAT。您可能只想删除所有格式。 确保将格式重新附加到任何 DATE 或 DATETIME 变量。确保需要检查的是 LABEL,而不是变量的 NAME。format _numeric_;
0赞
Lin
7/29/2023
我删除了数值变量的所有格式,但仍然不是十进制。然后我使用 Freeman 的代码(参见下文)“if index(upcase(vlabel(nums[index])), 'PERCENT') > 0 then nums[index]=nums[index] / 100; ”它起作用了。我还不确定原因。我稍后会看看。
0赞
Tom
7/29/2023
如果只是取决于你想搜索什么。不同之处在于 INDEX() 或 FIND() 只查找字符串,而 INDEXW() 和 FINDW() 查找单词。因此,如果标签中的字符串 PERCENT 没有通过您列出的第三个参数的分隔符之一与其他字符分隔,则它将不匹配。例如,如果标签具有 PERCENTAGE 而不是 PERCENT,则查找 WORD 将找不到它。
0赞
Lin
7/30/2023
明白了!非常感谢汤姆的帮助!
评论