arrays - 在 sas 循环中循环变量时遇到问题
问题描述
非常简单:我正在尝试将许多字符变量转换为数字。以下代码给出了“语法错误,期待以下内容:名称、-、:、;” 对于删除和重命名行。
data ex; set ex;
array numeric{3} var1 var2 var3;
do i=1 to 8;
temp = input(strip(numeric(i)),10.);
drop numeric(i);
rename temp = numeric(i);
end;
run;
你不能在 do 循环中使用 drop 或 rename 语句吗?
解决方案
数据集结构必须在编译数据步骤时确定。因此,您无法在重命名语句中使用数组引用。
如果你真的有简单的数字后缀变量名,那么你可以使用一个简单的 RENAME 语句。
rename new1-new3=var1-var3;
所以你的程序可能就这么简单:
data want;
set have;
array ch var1-var3;
array new new1-new3;
do index=1 to dim(ch);
new[index]=input(left(ch[index]),32.);
end;
drop index var1-var3;
rename new1-new3=var1-var3;
run;
如果名称列表更复杂,例如 AGE HEIGHT WEIGHT,那么您将需要使用更复杂的 RENAME 语句,例如:
rename new1=AGE new2=HEIGHT new3=WEIGHT ;
所以使用某种类型的代码生成方法。像宏代码或使用数据步骤将代码行写入文件,该文件可以包含在程序中的 using%include
语句中。
例如,您可以制作这样的宏:
%macro rename(varlist);
%local i;
rename
%do i=1 %to %sysfunc(countw(&varlist));
new&i=%scan(&varlist,&i)
%end;
;
%mend ;
并像这样使用它:
%let charvars=AGE HEIGHT WEIGHT;
data want;
set have;
array ch &charvars;
array new [%sysfunc(countw(&charvars))];
do index=1 to dim(ch);
new[index]=input(left(ch[index]),32.);
end;
drop index &charvars;
%rename(&charvars);
run;
推荐阅读
- json - Ansible json 密钥输出
- image - 如何在prefixIcon内的颤动TextFormField中添加图像
- python - Ply Lex Yacc :在某些规则中将 \n 视为标记,否则将其忽略
- python - Python 百分比计算 0E-14 作为结果
- angular - ng e2e 失败了一些使用 protractor protractor.conf 命令成功的测试用例
- python - 如何在 nameko 中使 RPC 调用异步?
- javascript - 为什么我没有获得 SonarQube 的覆盖范围?
- azure-automation - 从 Azure 自动化刷新分析服务模型时出错
- github-actions - “运行|”之间的区别 并在 github 操作中多次运行
- javascript - 更模块化的 D3.js 编码