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;
我想使用变量 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;