SAS是否具有与R中的all()或any()等效的函数
在R中,可以使用all()或any()函数跨列变量中的所有行执行条件。SAS中是否有等效的方法 我想要一个条件,如果列x中的任何行是负数,这应该返回TRUE 或者,如果列y中的所有行都是负数,则应返回TRUE 比如说SAS是否具有与R中的all()或any()等效的函数,sas,sas-iml,Sas,Sas Iml,在R中,可以使用all()或any()函数跨列变量中的所有行执行条件。SAS中是否有等效的方法 我想要一个条件,如果列x中的任何行是负数,这应该返回TRUE 或者,如果列y中的所有行都是负数,则应返回TRUE 比如说 x y -1 -2 2 -4 3 -4 4 -3 在R中: all(x如果您想对所有观察结果进行操作,那么使用SQL摘要函数可能最容易做到这一点 SAS将布尔表达式计算为1表示真,0表示假。因此,如果MAX(condition)为真(即等于1),则确定是否有任
x y
-1 -2
2 -4
3 -4
4 -3
在R中:
all(x如果您想对所有观察结果进行操作,那么使用SQL摘要函数可能最容易做到这一点 SAS将布尔表达式计算为1表示真,0表示假。因此,如果
为真(即等于1),则确定是否有任何观测值具有要测试的条件。如果MAX(condition)
为真,则确定所有观测值是否具有要测试的条件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;
SQL可能是最类似的方法,但数据步骤同样有效,并且对任何形式的修改都有好处——坦白地说,如果您试图学习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解决方案。当然,这很简单,因为
和任何
函数都以相同的名称存在……我还包括一个用于识别积极元素的示例所有
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;
默认情况下,SAS一次在一行上运行并循环,因此此行为是内置的。但是,不清楚您要作为输出查找什么,因此我们无法在此时回答您的问题。请显示您所需的输出。@Reeza-您可以执行
在R中。因为SAS一次只知道一行,所以您无法执行此类列操作。您可以轻松地在SAS中查看行,但我认为问题恰恰相反。通过所有操作(列<0)
可能可行:sql
(未测试)这很可能是一个X-Y问题。SAS不是一种矩阵语言,也没有您描述的功能;但它的工作方式与矩阵语言非常不同。从更大的角度来看,您在做什么,以至于proc sql;从表中选择sum(x>=0)=0;退出;
或any()
是您想要使用的?all()
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;