If statement 创建新变量
我想使用变量a到D创建一个新变量“重量”和“高度”: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
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)。谢谢啊,这是有道理的!非常感谢!