If statement 创建新变量

If statement 创建新变量,if-statement,sas,where,transpose,retain,If Statement,Sas,Where,Transpose,Retain,我想使用变量a到D创建一个新变量“重量”和“高度”: 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

我想使用变量a到D创建一个新变量“重量”和“高度”:

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缺失,则使用列D所在的列C屏幕。所以简单地说,假设Jim在筛选过程中称重,而不是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
语句创建结果数据,该语句应用于转置后的数据<代码>更新与
合并
的不同之处在于,更新数据集中缺少的值永远不会覆盖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子句不是有条件应用的,也不能在数据步骤运行时动态更改。where子句在“运行初始化”时应用。where子句是一个不可执行/无条件语句,数据步骤代码中最后出现的语句是将在步骤运行时应用的语句

例如,在下面的示例中,如果0则
永远不会为真,但无论应用了
何处

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;

所以你忽略了
C3
访问?如果不是,Jim的身高应该是
61
?你为什么要检查
C1D1
抱歉,我去掉了C1D1,它来自更详细的数据集。我忽略C3访问,因为我只关心C1(周期1)。谢谢啊,这是有道理的!非常感谢!