SAS 创建新变量

SAS Create New Variables

我想使用变量 A 到 D 创建一个新变量 'Weight' 和 'Height':

DATA: 
A       B     C    D       
Jim  Weight  180   Screen
Jim  Weight  200   C1
Jim  Height  60    Screen
Jim  Height  61    C3
Tod  Weight  190   Screen
Tod  Weight  201   C1
Tod  Height  70    Screen
Tod  Height        C1

权重变量将具有以下条件:如果列 B = 权重、列 D = C1 且列 C 不丢失,则将权重设置为列 C。否则,如果 D 列不是 C1 或缺少 C 列,则使用 C 列,其中 D 列是屏幕。所以简单来说,假设吉姆在筛选期间称重而不是 C1,那么我想保持他的筛选重量。或者,如果他在 C1 进行了筛选但遗失了重量,我想保持他的屏幕重量。对于高度变量也是如此。

我的错误代码是:

DATA MYTEST; 
    SET TEST.TEST; 
    if B = 'WEIGHT' and D = 'C1D1' and not missing(C) then NEW = C;
    else if (missing(C) or D ~= 'C1') and B = 'WEIGHT' then WEIGHT = C where D = 'Screen';
    if B = 'HEIGHT' and D = 'C1D1' and not missing(C) then NEW = C;
    else if (missing(C) or D ~= 'C1') and B = 'HEIGHT' then WEIGHT = C where D = 'Screen';
    else WEIGHT = 'NA';
 RUN; 
 PROC PRINT DATA = MYTEST; 
 RUN; 

期望的结果:

DATA: 
A    Weight   Height 
Jim   200       60
Tod   201       70

可以使用 update 语句创建结果数据,应用于转置后的数据。 UPDATE 在这方面与 MERGE 不同——更新数据集中的缺失值永远不会覆盖 PDV 中的现有值。

DATA have;
input 
a $  b $     c     d $; datalines;
Jim  Weight  180   Screen
Jim  Weight  200   C1
Jim  Height  60    Screen
Jim  Height  61    C3
Tod  Weight  190   Screen
Tod  Weight  201   C1
Tod  Height  70    Screen
Tod  Height  .     C1
run;

proc transpose data=have out=haveT;
  by a d notsorted;
  var c;
  id b;
run;

data haveScreen / view=haveScreen;
  set haveT;
  where d='Screen';
  by a;
  if first.a;
run;

data want;
  update
    haveScreen
    haveT (where=(d in ('Screen', 'C1')))
  ;
  by a;
run;

您发布的代码未正确使用 WHERE。 Where 子句不是有条件地应用的,也不能在数据步骤 运行ning 时动态更改。在“运行 初始化”时应用 where 子句。 where 子句是 non-executable/unconditional 语句,数据步骤代码中最后出现的语句是将在步骤 运行s.

时应用的语句

例如,在下面,if 0 永远不会为真,但无论如何都会应用 where

options msglevel=i;
data _null_;
  set sashelp.class;
  if name =: 'X' then where age > 12;
  if 0 then where age > 1;
run;
----- LOG -----
4625  options msglevel=i;
4626  data _null_;
4627    set sashelp.class;
4628    if name =: 'X' then where age > 12;
4629    if 0 then where age > 1;
NOTE: WHERE clause has been replaced.
4630    run;

NOTE: There were 19 observations read from the data set SASHELP.CLASS.
      WHERE age>1;