如何用参考表替换SAS字符变量中的*并转为数值型?
用参考表实现SAS变量的特定替换与数值转换
完全可以通过参考表来实现这个需求,这种方式的优势在于替换规则集中管理,后续调整替换值时无需修改主处理逻辑,更灵活易维护。
步骤1:创建替换规则参考表
先定义每个字符变量对应的替换值,把这些规则存在一个单独的数据集中:
data replace_vals; length varname $32 replace_val $20; input varname $ replace_val $; datalines; var1 2 var2 4.5 var3 3 ; run;
步骤2:基于参考表处理主数据集
使用SAS哈希表来快速匹配变量名与替换值,遍历所有字符变量完成替换,再转换为数值型:
data want; set have; * 定义存储原字符变量的数组; array char_vars[*] var1-var3; * 定义存储转换后数值变量的数组; array num_vars[*] num1-num3; * 仅在第一次迭代时加载参考表到哈希表; if _n_ = 1 then do; declare hash replace_map(dataset:'replace_vals'); replace_map.definekey('varname'); replace_map.definedata('replace_val'); replace_map.definedone(); call missing(varname, replace_val); end; * 遍历每个字符变量执行替换与转换; do i = 1 to dim(char_vars); varname = vname(char_vars[i]); * 从哈希表中获取当前变量的替换值; if replace_map.find() = 0 then do; * 替换*为对应的值; if char_vars[i] = '*' then char_vars[i] = replace_val; end; * 将处理后的字符转换为数值,存入数值数组; num_vars[i] = input(char_vars[i], best32.); end; * 清理临时变量; drop i varname replace_val; run;
补充说明
- 哈希表的作用是实现变量名与替换值的快速匹配,避免多次合并数据集的性能开销
- 代码中新建了
num1-num3三个数值变量存储转换结果,如果需要直接覆盖原字符变量,需先删除原变量再对数值变量重命名(或使用rename语句) - 后续调整替换规则时,仅需修改
replace_vals数据集,无需改动主处理代码
内容的提问来源于stack exchange,提问作者A. Bohyn
相关产品推荐
相关产品推荐

