问题描述
我有一个要清理的数据集。一个变量是性别,其中我有“ F”,“女性”,“ M”,“男性”和“未知”作为值。我想将所有的“ F”迭代更改为“女性”,将所有的“ M”值更改为“男性”。我还有一个名为“ Ethnicity”的变量,其值例如为“ 1- White”,但我希望它显示为“ White”。
我尝试使用tranwrd
gender=tranwrd(gender,"F","Female");
但这也将“女性”值替换为“女性”值
我也尝试过索引:
IF index(lowcase(gender),"f") THEN gender="Female";
IF index(lowcase(gender),"m") THEN gender="male";
但是多个If语句不起作用。
解决方法
看看是否可以将其用作模板
data have;
input gender $ 1-7 Ethnicity $ 9-18;
datalines;
F 1 - White
Female White
Male 2 - Black
Unknown Black
m 1 - White
f 1 - White
;
data want;
set have;
if upcase(char(gender,1)) = "M" then gender = "Male";
else if upcase(char(gender,1)) = "F" then gender = "Female";
else gender = "Unknown";
Ethnicity = compress(Ethnicity,'ka');
run;
,
您发现TRANWRD
对于即将进行的值转换任务是错误的功能。 INDEX
都不是,因为SAS中的真实值是非零且不丢失的状态-INDEX(
source,excerpt
)
结果将是对于在 excerpt
中找到 source
任何地方的情况,是合乎逻辑的。
对于特定的值转换,请使用直接文字值进行比较。要测试特定的单个字符,您可以按照显示的方式进行小写,或使用IN
列表。
if gender in ('M','m') then gender = 'Male'; else
if gender in ('F','f') then gender = 'Female';
对于从值构造 ethnicity
中提取# - ethnicity
的情况,您可以按照@draycut,将COMPRESS
函数与 keep一起使用选项(ka
)。
变换模式值的另一种方法是使用正则表达式搜索和替换。
* replace leading # - before embedded ethnicity with no string (//);
ethnicity = prxchange ('/^\d+\s*-\s*//',1,ethnicity);