替换SAS中的多个字符串值

问题描述

我有一个要清理的数据集。一个变量是性别,其中我有“ 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);

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...