【问题标题】:SAS - Find number of observations within multiple BY groups and delete specific observationsSAS - 在多个 BY 组中查找观察数并删除特定观察
【发布时间】:2019-03-20 21:36:51
【问题描述】:

我想尝试找到一种方法来计算多个(超过两个)BY 组变量中的观察次数。之后,我希望删除与计数小于 2 的观察有关的观察。这是我正在尝试做的一个示例:

VAR1 VAR2 VAR3
 a     a    1
 a     a    2
 a     b    1
 a     b    2
 b     a    1
 b     a    2
 b     b    1
 b     b    2
 c     a    1
 c     b    1
 d     a    1

在这里,我想确保 VAR3 相对于 VAR1 和 VAR2 有两个不同的值。

在此示例中,您可以看到我想删除最后三个观察值,因为每个 VAR1/VAR2 对都有一个值。

有没有简单的方法来做到这一点?

我试过了:

data want;
set have;
by VAR1 VAR2 VAR3;
if first.VAR3 = last.VAR3 then delete;
run;

但这不起作用,因为它删除了在同一个 VAR1 中具有相同 VAR3 的观察结果。我需要帮助构建更强大的东西。

最后,我想要这个:

VAR1 VAR2 VAR3
 a     a    1
 a     a    2
 a     b    1
 a     b    2
 b     a    1
 b     a    2
 b     b    1
 b     b    2

不胜感激。 谢谢你。

编辑:

为我需要的东西提供额外的清晰度。 我想检查 VAR3 是否包含 VAR1 和 VAR2 存在的每个组合的值 1 和 2 。如果条目仅包含其中一个值或不包含,则删除。

谢谢。

【问题讨论】:

    标签: sas


    【解决方案1】:

    由于您的条件取决于 VAR1*VAR2 组中的所有值,您可能希望使用双 DOW 循环。在第一个循环中计算标志,在第二个循环中使用这些标志来决定要写入哪些观察结果。

    data have;
      input VAR1 $ VAR2 $ VAR3 @@;
    cards;
    a a 1 a a 2 a b 1 a b 2 b a 1 b a 2 b b 1 b b 2 c a 1 c b 1 d a 1
    ;
    
    
    data want;
      do until(last.var2);
        set have;
        by VAR1 VAR2 VAR3;
        if var3=1 then any1=1;
        else if var3=2 then any2=1;
        else anyother=1;
      end;
      do until(last.var2);
        set have;
        by VAR1 VAR2 VAR3;
        if any1 and any2 and not anyother then output;
      end;
      drop any1 any2 anyother;
    run;
    

    【讨论】:

      【解决方案2】:

      类似的东西。

        data have;
      input
      VAR1 $ VAR2 $;
      datalines;
      a     a
      a     a
      a     b
      a     b
      b     a
      b     a
      b     b
      b     b
      c     a
      c     b
      d     a 
      ;
      
      proc sort data=have ;
       by var1 var2;
      run;
      
      data want;
      set have;
      by var1 var2;
      if first.var1 or first.var2 then var3=1;
      else var3+1;
      if (first.var1 and last.var1) or (first.var2 and last.var2) then delete;
      run;
      
      proc print;
      

      【讨论】:

      • 感谢您的回复。这是我尝试一些新想法的好方法。但是我正在寻找更多关于检查 VAR3 是否仅包含 1 和 2,对于为 VAR1 和 VAR2 给出的每个组合。否则,如果该条目仅包含这些值之一或不包含这些值,则删除该条目。
      • 没有必要检查 first.var1(和 last.var1),因为当 first.var1 为 1 时,first.var2 将始终为 1,最后一个相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      相关资源
      最近更新 更多