仅当 by 组中的输出变量

  • 本文关键字:输出 变量 by 仅当 sas
  • 更新时间 :
  • 英文 :


我第一次发帖。我对SAS编程(实际上是所有编程(很陌生。 这似乎是一个简单的问题,但无法弄清楚。 我有一些交叉表输出,我正在尝试将其成形以便于输出到表格。 如果 by 组中只有 3 个观察值,我想保留该组中的第一个观察值。 如果有超过 3 个观察,我想保留除最后一个之外的所有观察。 所以,例如,这是我所拥有的:

Group1  Group2  Percent
var1    1   0.25
var1    1   0.75
var1    1   1
var1    2   0.4
var1    2   0.6
var1    2   1
var1    3   0.7
var1    3   0.3
var1    3   0.6
var2    1   0.1
var2    1   0.2
var2    1   0.4
var2    1   0.3
var2    1   1
var2    2   0.2
var2    2   0.2
var2    2   0.2
var2    2   0.2
var2    2   1
var2    3   0.7
var2    3   0.1
var2    3   0.05
var2    3   0.05
var2    3   0.1

这是我在新数据集中想要的

Group1  Group2  Percent
var1    1   0.25
var1    2   0.4
var1    3   0.7
var2    1   0.1
var2    1   0.2
var2    1   0.4
var2    1   0.3
var2    2   0.2
var2    2   0.2
var2    2   0.2
var2    2   0.2
var2    3   0.7
var2    3   0.1
var2    3   0.05
var2    3   0.05

希望这很清楚,但如果需要更多信息,请告诉我。

我将其

分解为几个步骤来帮助您查看逻辑,并使用了数据步骤和 SQL。基本上,你想计算每个组中有多少,并保持所有计数(组内的计数和总数(,以便您可以使用它们来制作最终逻辑。

data test;
    length GROUP1 $5 GROUP2 PERCENT 8;
    input GROUP1 $ GROUP2 PERCENT;
    datalines;
    var1    1   0.25
    var1    1   0.75
    var1    1   1
    var1    2   0.4
    var1    2   0.6
    var1    2   1
    var1    3   0.7
    var1    3   0.3
    var1    3   0.6
    var2    1   0.1
    var2    1   0.2
    var2    1   0.4
    var2    1   0.3
    var2    1   1
    var2    2   0.2
    var2    2   0.2
    var2    2   0.2
    var2    2   0.2
    var2    2   1
    var2    3   0.7
    var2    3   0.1
    var2    3   0.05
    var2    3   0.05
    var2    3   0.1 
    ;
run;
** count the number of obs per group **;
data test_ct; set test;
    by GROUP1 GROUP2;
    COUNT + 1;
    if first.GROUP2 then COUNT = 1;
run;
** count the total number of obs per group and output on each row **;
proc sql noprint;
    create table test_ct_all as
    select *, count(*) as COUNT_TOTAL
    from test_ct group by GROUP1,GROUP2
    order by GROUP1, GROUP2, COUNT;
quit;
** logic to keep records **;
data keep_flags; set test_ct_all;
    if COUNT=1 and COUNT_TOTAL=3 then KEEP=1;
    *the last record will have COUNT and COUNT_TOTAL equal;
    if COUNT_TOTAL > 3 and (COUNT_TOTAL ne COUNT) then KEEP=1;
run;
** output only the keep records **;
data keepers; set keep_flags;
    if KEEP=1;
run;

最新更新