【问题标题】:Find if any of values in group is in certain values in SAS查找组中的任何值是否在 SAS 中的某些值中
【发布时间】:2022-08-11 12:28:54
【问题描述】:

我试图查看分组变量中的任何元素是否在一组值中。

SAS 或 PROC SQL 解决方案都可以使用。

这是一个示例数据集:

data input;/*table name*/
length ID 3 var1 $8;/*define char length*/
input ID var1 $;/*$ signifies char*/
datalines;/*start data*/
1 A
1 A
1 B
2 A
2 A
2 A
;/*end data*/
run;

ID  var1
1   A
1   A
1   B
2   A
2   A
2   A

我想看看每个组IDvar1 中的任何值是否等于“B”或“C”。如果其中之一是 \"B\" 或 \"C\",那么我希望输出表等于 1,否则为 0。在此示例中,因为组 ID = 1 在 @987654328 中有一个 \"B\" @,var2 的输出将等于 1。对于组 ID = 2,var2 应等于 0。

在 R 中,我会使用 any(),这将相当简单。我知道 SAS 在 SAS IML 中有类似的功能,但我不确定它是否可以以相同的方式使用。我正在寻找一种相对简单的方法来避免使用do 循环或子查询。

这是所需的输出:

data output;/*table name*/
input ID var2;/*$ signifies char*/
datalines;/*start data*/
1 1
2 0
;/*end data*/
run;

ID  var2
1   1
2   0

我发现了一些类似的资源,但没有找到任何直接针对这个问题的资源。

Similar SQL Question

Similar SAS Community Question 1

Similar SAS Community Question 2

SAS IML any()/all() Question

    标签: sas


    【解决方案1】:

    SAS 将布尔表达式计算为 1 (TRUE) 或 0 (FALSE)。因此,组上的 MAX() 将指示其中任何一个是否为真。

    data input;
      length ID 8 var1 $1 ;
      input ID var1 ;
    datalines;
    1 A
    1 A
    1 B
    2 A
    2 A
    2 A
    ;
    
    proc sql noprint;
    create table want as
      select id
           , max( var1 in ('B' 'C') ) as var2
      from input
      group by id
    ;
    quit;
    
    proc print;
    run;
    

    PS:仅保留存储数值所需的 8 个字节中的 3 个所涉及的风险不值得节省任何微小的磁盘空间。但是对于字符变量,您可以通过仅根据需要定义长度来节省大量空间,因为字符变量最长可达 32,767 字节。在变量已经定义为字符之后,在 INPUT 语句中添加 $ 也没有任何价值。一旦定义了变量的类型,您无论如何都无法更改它。

    【讨论】:

      【解决方案2】:

      这里有几个不同的概念:

      • 使用 FIRST 将每个 ID 开头的标志设置为 0。
      • 使用 IN 检查值列表。
      • 使用 RETAIN 来保持该值沿列向下循环。
      • 使用 Last 在每个 ID 的最后一条记录处输出标志。
      data output;
      set input;
      by ID;
      if first.ID then var2=0;
      retain var2;
      if var1 in ('B', 'C') then var2=1;
      if last.ID then output;
      drop var1;
      run;
      

      【讨论】:

      • 谢谢,这有效并且可以满足我的要求。我编辑了表和 var 名称以匹配我的问题。
      猜你喜欢
      • 2021-12-12
      • 2021-02-25
      • 2013-05-24
      • 2020-06-20
      • 1970-01-01
      • 2018-03-25
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多