如何用INPUT函数批量将数据集所有?缺失值转为.(SAS)
批量将SAS数据集中的字符型缺失值
?转换为数值型缺失值. 方法1:保留原变量,生成对应数值变量
适合需要同时保留原字符变量和转换后数值变量的场景:
1. 获取待转换的字符型变量列表
先提取数据集中所有字符型变量名称,存入宏变量:
/* 导出数据集元数据,筛选字符型变量(TYPE=2为字符型) */ PROC CONTENTS DATA=DML.RISKS OUT=VAR_INFO(WHERE=(TYPE=2)) KEEP=NAME; RUN; /* 将字符变量名存入宏变量char_vars_list */ PROC SQL NOPRINT; SELECT NAME INTO :char_vars_list SEPARATED BY ' ' FROM VAR_INFO; QUIT;
2. 批量转换变量
用数组遍历所有字符变量,生成带_num后缀的数值变量:
DATA NEW_RISKS; SET DML.RISKS; /* 定义字符变量数组 */ ARRAY char_vars[*] &char_vars_list.; /* 定义对应数值变量数组,变量名为原变量名+_num */ ARRAY num_vars[*] %sysfunc(tranwrd(&char_vars_list., ' ', '_num '))_num; /* 遍历每个变量执行转换 */ DO i = 1 TO DIM(char_vars); num_vars[i] = INPUT(char_vars[i], 32.); END; DROP i; /* 清理循环临时变量 */ RUN;
方法2:直接覆盖原字符变量为数值型
如果不需要保留原字符变量,可直接将其转换为数值型:
/* 先获取字符变量列表(同方法1的第一步) */ PROC CONTENTS DATA=DML.RISKS OUT=VAR_INFO(WHERE=(TYPE=2)) KEEP=NAME; RUN; PROC SQL NOPRINT; SELECT NAME INTO :char_vars_list SEPARATED BY ' ' FROM VAR_INFO; QUIT; /* 批量转换并覆盖原变量 */ DATA RISKS_UPDATED; /* 先加载不含待转换变量的数据集部分 */ SET DML.RISKS(DROP=&char_vars_list.); /* 再加载待转换的字符变量 */ SET DML.RISKS(KEEP=&char_vars_list.); /* 逐个转换为数值型 */ %DO i=1 %TO %sysfunc(countw(&char_vars_list.)); %let current_var = %scan(&char_vars_list., &i.); ¤t_var. = INPUT(¤t_var., 32.); %END; RUN;
注意事项
- 转换前需确认字符变量中的非
?内容均可转换为数值,否则会生成无效缺失值. - 若只需转换特定变量(如前缀为
STD的变量),可修改PROC CONTENTS的WHERE条件,例如WHERE=(TYPE=2 AND NAME LIKE 'STD%')
内容的提问来源于stack exchange,提问作者Quinn
相关产品推荐
相关产品推荐

