Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAS是否具有与R中的all()或any()等效的函数_Sas_Sas Iml - Fatal编程技术网

SAS是否具有与R中的all()或any()等效的函数

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),则确定是否有任

在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),则确定是否有任何观测值具有要测试的条件。如果
    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-您可以执行
    所有操作(列<0)
    在R中。因为SAS一次只知道一行,所以您无法执行此类列操作。您可以轻松地在SAS中查看行,但我认为问题恰恰相反。通过
    sql
    可能可行:
    proc sql;从表中选择sum(x>=0)=0;退出;
    (未测试)这很可能是一个X-Y问题。SAS不是一种矩阵语言,也没有您描述的功能;但它的工作方式与矩阵语言非常不同。从更大的角度来看,您在做什么,以至于
    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;