在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;
问题根源
- 大小写不匹配:代码中先用
lowcase()把headache和breasttenderness转成了小写,但后续判断是否为“Don't know/refuse”时用的是原大小写字符串,导致条件不成立,目标选项没有被置为空。 - 格式映射不匹配:如果
$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
相关产品推荐
相关产品推荐

