You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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.);
        &current_var. = INPUT(&current_var., 32.);
    %END;
RUN;

注意事项

  • 转换前需确认字符变量中的非?内容均可转换为数值,否则会生成无效缺失值.
  • 若只需转换特定变量(如前缀为STD的变量),可修改PROC CONTENTS的WHERE条件,例如WHERE=(TYPE=2 AND NAME LIKE 'STD%')

内容的提问来源于stack exchange,提问作者Quinn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:45:30