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

在SAS中移除“Don't know/refuse”级别时数值变量全缺失的问题排查

问题:移除PMS症状变量中的未知选项后数值转换全缺失

尝试移除headache和breasttenderness变量中的“Don't know/refuse”选项,但转换后的breasttenderness_num和headache_num所有值均缺失。症状变量包含以下五个级别:“Not at all”“Mild”“Moderate”“Severe”“Don't know/refuse”,原处理代码如下:

data temp;
set pms.edc_data;
headache = strip(lowcase(headache));
breasttenderness = strip(lowcase(breasttenderness));

if headache = "Don't know/refuse" then headache = "";
if breasttenderness = "Don't know/refuse" then breasttenderness = "";

array char_vars {*} bloating breasttenderness dizzy headache hotflashes 
heart_palpitations nausea swelling_extremities acne diarrhea_constipation fatigue 
abdominal_cramping lower_backpain food_cravings appetite_change insomnia confusion 
forgetfulness anxiety irritability emotional_hypersensitivity mood_swings depression 
cry anger alone;

array num_vars {*} bloating_num breasttenderness_num dizzy_num headache_num 
hotflashes_num heart_palpitations_num nausea_num swelling_extremities_num acne_num 
diarrhea_constipation_num fatigue_num abdominal_cramping_num lower_backpain_num 
food_cravings_num appetite_change_num insomnia_num confusion_num forgetfulness_num 
anxiety_num irritability_num emotional_hypersensitivity_num mood_swings_num 
depression_num cry_num anger_num alone_num;

do i = 1 to dim(char_vars);
char_vars{i} = strip(char_vars{i});  
if char_vars{i} ne "" then
 num_vars{i} = input(put(char_vars{i}, $severity_fmt.), best32.);
else if char_vars{i} = "" then
    num_vars{i} = .;
end;

drop i;
run;

问题根源

  1. 大小写不匹配:代码中先用lowcase()把headache和breasttenderness转成了小写,但后续判断是否为“Don't know/refuse”时用的是原大小写字符串,导致条件不成立,目标选项没有被置为空。
  2. 格式映射不匹配:如果$severity_fmt.格式定义中使用的是原始大写/混合大小写的标签(比如"Not at all"),而变量已经被转成小写("not at all"),put函数无法匹配格式,返回空值,最终input转换后得到缺失值。

修正方案

方案1:统一大小写匹配

把判断条件中的字符串改成小写,同时确保格式$severity_fmt.的标签也是小写:

data temp;
set pms.edc_data;
headache = strip(lowcase(headache));
breasttenderness = strip(lowcase(breasttenderness));

// 修正为小写的匹配字符串
if headache = "don't know/refuse" then headache = "";
if breasttenderness = "don't know/refuse" then breasttenderness = "";

array char_vars {*} bloating breasttenderness dizzy headache hotflashes 
heart_palpitations nausea swelling_extremities acne diarrhea_constipation fatigue 
abdominal_cramping lower_backpain food_cravings appetite_change insomnia confusion 
forgetfulness anxiety irritability emotional_hypersensitivity mood_swings depression 
cry anger alone;

array num_vars {*} bloating_num breasttenderness_num dizzy_num headache_num 
hotflashes_num heart_palpitations_num nausea_num swelling_extremities_num acne_num 
diarrhea_constipation_num fatigue_num abdominal_cramping_num lower_backpain_num 
food_cravings_num appetite_change_num insomnia_num confusion_num forgetfulness_num 
anxiety_num irritability_num emotional_hypersensitivity_num mood_swings_num 
depression_num cry_num anger_num alone_num;

do i = 1 to dim(char_vars);
char_vars{i} = strip(lowcase(char_vars{i})); // 统一所有字符变量为小写
if char_vars{i} ne "" then
 num_vars{i} = input(put(char_vars{i}, $severity_fmt.), best32.);
else
    num_vars{i} = .;
end;

drop i;
run;

同时确保格式定义为小写标签:

proc format;
value $severity_fmt
"not at all" = 0
"mild" = 1
"moderate" = 2
"severe" = 3;
run;

方案2:不转换大小写,直接匹配原始值

如果不想修改格式,去掉lowcase()转换,直接用原始字符串判断:

data temp;
set pms.edc_data;
headache = strip(headache);
breasttenderness = strip(breasttenderness);

if headache = "Don't know/refuse" then headache = "";
if breasttenderness = "Don't know/refuse" then breasttenderness = "";

array char_vars {*} bloating breasttenderness dizzy headache hotflashes 
heart_palpitations nausea swelling_extremities acne diarrhea_constipation fatigue 
abdominal_cramping lower_backpain food_cravings appetite_change insomnia confusion 
forgetfulness anxiety irritability emotional_hypersensitivity mood_swings depression 
cry anger alone;

array num_vars {*} bloating_num breasttenderness_num dizzy_num headache_num 
hotflashes_num heart_palpitations_num nausea_num swelling_extremities_num acne_num 
diarrhea_constipation_num fatigue_num abdominal_cramping_num lower_backpain_num 
food_cravings_num appetite_change_num insomnia_num confusion_num forgetfulness_num 
anxiety_num irritability_num emotional_hypersensitivity_num mood_swings_num 
depression_num cry_num anger_num alone_num;

do i = 1 to dim(char_vars);
char_vars{i} = strip(char_vars{i});  
if char_vars{i} ne "" then
 num_vars{i} = input(put(char_vars{i}, $severity_fmt.), best32.);
else
    num_vars{i} = .;
end;

drop i;
run;

此时格式$severity_fmt.需匹配原始标签:

proc format;
value $severity_fmt
"Not at all" = 0
"Mild" = 1
"Moderate" = 2
"Severe" = 3;
run;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:30:02