SAS中如何智能转换字符变量:可转数值则转,否则保留字符
解决方案
SAS数据集的变量只能是单一类型(字符型或数值型),无法让一个变量同时存储数值和字符值。要实现“可转数值则转换,否则保留原字符”的需求,可参考以下两种实用方案:
方案1:拆分存储数值与字符变量
创建两个变量,分别存储转换后的数值(仅可转换的记录有值)和原字符值,同时添加标记变量区分类型:
data want; set have; /* 验证字符串是否符合数值格式:允许数字、小数点、正负号,且符号/小数点不重复 */ is_numeric = (verify(old, '0123456789.-+') = 0) and count(old, '.') <= 1 and count(old, '-') <= 1 and count(old, '+') <= 1; /* 可转换则生成数值变量 */ if is_numeric then num_value = input(old, BEST12.); /* 不可转换则保留原字符值 */ else char_value = old; run;
如果需要处理带千分位的数值(如"1,234.56"),可先清理字符串再判断:
data want; set have; clean_old = compress(old, ','); is_numeric = (verify(clean_old, '0123456789.-+') = 0) and count(clean_old, '.') <= 1 and count(clean_old, '-') <= 1 and count(clean_old, '+') <= 1; if is_numeric then num_value = input(clean_old, BEST12.); else char_value = old; run;
方案2:统一存储为字符型(保留数值格式)
如果希望只用一个变量存储,可统一转为字符型,将可转换的数值转为字符格式的数值,其余保留原文本:
data want; set have; clean_old = compress(old, ','); is_numeric = (verify(clean_old, '0123456789.-+') = 0) and count(clean_old, '.') <= 1 and count(clean_old, '-') <= 1 and count(clean_old, '+') <= 1; if is_numeric then unified_var = put(input(clean_old, BEST12.), BEST12.); else unified_var = old; run;
关键函数说明
verify(source, chars):返回source中第一个不在chars里的字符位置,返回0则说明所有字符都在允许范围内。count(source, char):统计字符在字符串中出现的次数,避免多个小数点或符号的无效数值。
内容的提问来源于stack exchange,提问作者jackahall
相关产品推荐
相关产品推荐

