SAS是否具有与R中的all()或any()等效的功能
Does SAS have a equivalent function to all() or any() in R
在 R 中,您可以使用 all() 或 any() 函数对列变量中的所有行执行条件。 SAS 中是否有等效方法?
如果 x 列中的任何行都是负数,我想要条件,这应该 return TRUE。
或者,如果 y 列中的所有行都是负数,这应该 return TRUE。
例如
x y
-1 -2
2 -4
3 -4
4 -3
在 R 中:
all(x<0)
会给出输出 FALSE
all(y<0)
将给出输出 TRUE
我希望在 SAS 中复制相同的列操作。
如果您想对所有可能最容易使用 SQL 汇总函数进行的观察进行操作。
SAS 会将布尔表达式计算为 1 表示真,0 表示假。因此,要找出任何观察是否有条件,您需要测试 MAX( condition )
是否为真(即等于 1)。要查明是否所有观察结果都符合您要测试的条件,请测试 MIN( condition )
是否为真。
data have ;
input x y @@;
cards;
-1 -2 2 -4 3 -4 4 -3
;
proc sql ;
create table want as
select
min(x<0) as ALL_X
, max(x<0) as ANY_X
, min(y<0) as ALL_Y
, max(y<0) as ANY_Y
from have
;
quit;
结果
Obs ALL_X ANY_X ALL_Y ANY_Y
1 0 1 1 1
SQL 可能是最 feels-like 类似的方法,但数据步骤同样有效,并且更适合任何类型的修改 - 坦率地说,如果您正在尝试学习 SAS,从学习如何以 SAS 方式做事的角度来看,这可能是一条简单的路。
data want;
set have end=eof;
retain any_x all_x; *persist the value across rows;
any_x = max(any_x, (x>0)); *(x>0) 1=true 0=false, keep the MAX (so keep any true);
all_x = min(all_x, (x>0)); *(x>0) keep the MIN (so keep any false);
if eof then output; *only output the final row to a dataset;
*and/or;
if eof then do; *here we output the any/all values to macro variables;
call symputx('any_x',any_x); *these macro variables can further drive logic;
call symputx('all_x',all_x); *and exist in a global scope (unless we define otherwise);
end;
run;
为了完整起见,这里是 SAS-IML 解决方案。当然,这很简单,因为 any
和 all
函数以相同的名称存在...我还提供了一个使用 loc 来识别正元素的示例。
data have ;
input x y @@;
cards;
1 2
2 4
3 -4
4 -3
;
run;
proc iml;
use have;
read all var {"x" "y"};
print x y;
x_all = all(x>0);
x_any = any(x>0);
y_all = all(y>0);
y_any = any(y>0);
y_pos = y[loc(y>0)];
print x_all x_any y_all y_any;
print y_pos;
quit;
在 R 中,您可以使用 all() 或 any() 函数对列变量中的所有行执行条件。 SAS 中是否有等效方法?
如果 x 列中的任何行都是负数,我想要条件,这应该 return TRUE。
或者,如果 y 列中的所有行都是负数,这应该 return TRUE。
例如
x y
-1 -2
2 -4
3 -4
4 -3
在 R 中:
all(x<0)
会给出输出 FALSEall(y<0)
将给出输出 TRUE
我希望在 SAS 中复制相同的列操作。
如果您想对所有可能最容易使用 SQL 汇总函数进行的观察进行操作。
SAS 会将布尔表达式计算为 1 表示真,0 表示假。因此,要找出任何观察是否有条件,您需要测试 MAX( condition )
是否为真(即等于 1)。要查明是否所有观察结果都符合您要测试的条件,请测试 MIN( condition )
是否为真。
data have ;
input x y @@;
cards;
-1 -2 2 -4 3 -4 4 -3
;
proc sql ;
create table want as
select
min(x<0) as ALL_X
, max(x<0) as ANY_X
, min(y<0) as ALL_Y
, max(y<0) as ANY_Y
from have
;
quit;
结果
Obs ALL_X ANY_X ALL_Y ANY_Y
1 0 1 1 1
SQL 可能是最 feels-like 类似的方法,但数据步骤同样有效,并且更适合任何类型的修改 - 坦率地说,如果您正在尝试学习 SAS,从学习如何以 SAS 方式做事的角度来看,这可能是一条简单的路。
data want;
set have end=eof;
retain any_x all_x; *persist the value across rows;
any_x = max(any_x, (x>0)); *(x>0) 1=true 0=false, keep the MAX (so keep any true);
all_x = min(all_x, (x>0)); *(x>0) keep the MIN (so keep any false);
if eof then output; *only output the final row to a dataset;
*and/or;
if eof then do; *here we output the any/all values to macro variables;
call symputx('any_x',any_x); *these macro variables can further drive logic;
call symputx('all_x',all_x); *and exist in a global scope (unless we define otherwise);
end;
run;
为了完整起见,这里是 SAS-IML 解决方案。当然,这很简单,因为 any
和 all
函数以相同的名称存在...我还提供了一个使用 loc 来识别正元素的示例。
data have ;
input x y @@;
cards;
1 2
2 4
3 -4
4 -3
;
run;
proc iml;
use have;
read all var {"x" "y"};
print x y;
x_all = all(x>0);
x_any = any(x>0);
y_all = all(y>0);
y_any = any(y>0);
y_pos = y[loc(y>0)];
print x_all x_any y_all y_any;
print y_pos;
quit;