【问题标题】:Compare rows within group of size two比较大小为 2 的组中的行
【发布时间】:2020-11-27 02:44:05
【问题描述】:

当第一行无关紧要时,我有以下代码可以很好地比较组中的行。

data want_Find_Change;
    set WORK.IA;
    by ID;

    array var[*]  $      RATING;
    array lagvar[*]  $   zRATING;
    array changeflag[*] RATING_UPDATE;

    do i = 1 to dim(var);
        lagvar[i] = lag(var[i]);
    end;

    do i = 1 to dim(var) ;
        changeflag[i] = (var[i] NE lagvar[i] AND NOT first.ID);
    end;

   drop i;
run;

不幸的是,当我使用每组有两行的数据集时,我得到不正确的返回,我假设是因为必须在比较中使用第一行。我怎样才能比较唯一的行和第二行的返回值。这不起作用:

data Change;
    set WORK.Two;
    by ID;
    changeflag = last.RATING NE first.RATING;
run;

我拥有和想要的数据示例

 Group    Name     Sport     DogName   Eligibility 
   1      Tom      BBALL     Toto        Yes
   1      Tom      golf      spot        Yes
   2     Nancy     vllyball  Jimmy       yes
   2     Nancy     vllyball  rover       no

想要

  Group    Name     Sport     DogName   Eligibility N_change  S_change  D_Change  E_change
     1      Tom      BBall     Toto        Yes      0           0        0       0
     1      Tom      golf      spot        Yes      0           1        1       0
     2     Nancy     vllyball  Jimmy       yes      0           0        0       0
     2     Nancy     vllyball  rover       no       0           0        1       1

【问题讨论】:

  • 请用数据而不是代码来说明您的问题。
  • 您的代码是一个数据步骤。看不出这跟SQL有什么关系,所以把标签去掉了。
  • proc sql 在这里可能有用
  • 使用提供的代码并将其调整到您的want 数据集,我能够获得所需的结果。

标签: sas proc-sql


【解决方案1】:

如果您只希望第一行不被标记,您首先需要创建一个变量来枚举每个组中的行。你可以这样做:

data temp;
  set have;
  count + 1;
  by Group;
  if first.Group then count = 1;
run;

在第二步中,您可以运行带有子查询的 proc sql,按组计算不同的计数,以及以下情况:

proc sql;
create table want as
select 
Group, Name, Sport, DogName, Eligibility, 
case when count_name > 1 and count > 1 then 1 else 0 end as N_change,
case when count_sport > 1 and count > 1 then 1 else 0 end as S_change,
case when count_dog > 1 and count > 1 then 1 else 0 end as D_change,
case when count_E > 1 and count > 1 then 1 else 0 end as E_change
from (select *,
      count(distinct(Name)) as count_name,
      count(distinct(Sport)) as count_sport, 
      count(distinct(DogName)) as count_dog, 
      count(distinct(Eligibility)) as count_E
      from temp
      group by Group);
quit;

最好的,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    相关资源
    最近更新 更多