SAS将数字变量覆盖为字符

SAS Overwrite numeric variable to character

我有一个数字变量(例如圆柱体),我想将它覆盖为一个字符(并使其在 table 中保持相同的顺序)。

我想一步完成。有什么聪明的方法吗?

data cars; set sashelp.cars; 
if cylinders >= 6 then cylinders = 'Big'; 
if cylinders < 6 then cylinders 'Ecocar'; 
run;

我只是想避免创建新字符变量然后不得不将该新字符变量重新定位到圆柱体在 table 中的位置的繁琐步骤。

一旦定义了变量,就不能在不创建新变量的情况下将其从一种类型更改为另一种类型。在制作之前,您需要在 table 中定义它的位置。快速的方法是在 set 语句之前使用 retain 语句来定义预先存在的变量的顺序,而不必担心它们是什么类型。

data cars; 
    retain make model type origin drivetrain _cylinders;
    length cylinders .;

    set sashelp.cars(rename=(cylinders = _cylinders)); 

    if _cylinders >= 6 then cylinders = 'Big'; 
    if _cylinders < 6 then cylinders = 'Ecocar'; 

    drop _cylinders;
run;

另一种方法是首先创建一个虚拟 table,它看起来完全符合您的要求,并且具有您需要的所有可变属性。只用一个空行填充它,这样以后很容易重新排列。我们称它为 cars_attribs。例如:

Type    C    C     C    C      C          C         N    N       N          ...
Column  make model type origin drivetrain cylinders msrp invoice enginesize ...
Row                                                 .    .       .          ...

在带有 obs=0set 语句中使用此 table 以始终保持您最喜欢的变量位置。

   data cars; 
    set cars_attribs(obs=0)
        sashelp.cars(rename=(cylinders = _cylinders));
    ;

    if _cylinders >= 6 then cylinders = 'Big'; 
    if _cylinders < 6 then cylinders = 'Ecocar'; 

    drop _cylinders;
run;

如果您想更改可变位置,只需拖动列在企业指南中重新排列 cars_attribs

尝试使用 Proc 格式

Proc format;
      Value CylSize
           0 - 6 = ‘Ecocar’
           7 - high = ‘Big’;
Run;

Data cars;
   Set sashelp.cars;
    Format Cylinders CylSize.;
Run;

您可以查询元数据以找到变量的顺序,并使用它在正确的位置定义新变量。

但是我们假设如果变量的顺序对您很重要,那么您已经知道第一个变量的名称。

通过使用基于位置的变量列表,仅包括直到 CYLINDERS 的变量。然后定义你的新变量。然后重新读取所有变量的观察结果,以便 CYLINDERS 之后的变量出现在新变量之后。

现在您添加代码来填充新变量。放下旧的。并将新名称重命名为旧名称。

所以如果第一个变量被命名为使你的代码看起来像:

data want ;
  set sashelp.cars(keep=MAKE -- CYLINDERS);
  length new_var  ;
  set sashelp.cars;

  if cylinders >= 6 then new_var = 'Big'; 
  else if not missing(cylinders) then new_var = 'Ecocar'; 

  drop CYLINDERS;
  rename new_var=CYLINDERS;
run;

您可以使用重命名和保留:

data cars(drop=temp);
retain Make Model Type Origin DriveTrain MSRP Invoice EngineSize cylinders Horsepower 
       MPG_City MPG_Highway Weight Wheelbase Length;
set sashelp.cars(rename=(cylinders=temp));
if temp >= 6 then cylinders = 'Big'; 
if temp < 6 then cylinders = 'Ecocar'; 
run;

你也可以使用proc sql:

proc sql;
create table cars as 
select Make, Model, Type, Origin, DriveTrain, MSRP, Invoice, EngineSize,
        case when cylinders >= 6 then 'Big'
             when cylinders < 6 then 'Ecocar' end as cylinders,
        Horsepower, MPG_City, MPG_Highway, Weight, Wheelbase, Length
from sashelp.cars
;
quit;