按组比较最后一行和前一行并填充新列

Compare last row to previous row by group and populate new column

我需要将组的最后一行与其上面的行进行比较,查看是否有几列发生变化,如果发生变化,则用 1 填充新列。下面的数据展示会更好的解释。

还需要考虑只有 1 行的组。

我们有:

 Group    Name     Sport     DogName   Eligibility 
   1      Tom      BBALL     Toto        Yes
   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      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

只关心组内行与行之间的变化。提前感谢您的帮助。

这些行已经排好了,所以我们只需要最后两行。如果比较一组中的连续行更容易,那么这对我的目的来说同样好。

我确实知道这将是数组,但我对它们很纠结,因为从来没有将它们用于我典型的 sas 建模。想让事情简短而甜蜜。

使用数据步长和滞后语句。确保您的数据首先按组排序,并且组内的行以正确的顺序排序。使用数组将使您的代码更小。

下面的逻辑会将每一行与前一行进行比较。只有在以下情况下才会设置标志 1:

  1. 不是组的第一行
  2. 当前值与之前的值不同。

语法 var = (test logic); 是自动生成虚拟标志的快捷方式。

data want;
    set have;
    by group;

    array var[*]        name sport dogname eligibility;
    array lagvar[*] $   lag_name lag_sport lag_dogname lag_eligibility;
    array changeflag[*] N_change S_change D_change E_change;

    do i = 1 to dim(var);
        lagvar[i]     = lag(var[i]);
        changeflag[i] = (var[i] NE lagvar[i] AND NOT first.group);
    end;
  
   drop lag: i;
run;

过程程序员在 SQL 中发现这种困境并不少见,它主要是行没有位置的集合语言。如果您编写一个读取 select 数据(按所需顺序排序)的过程,它可以有变量来控制在输出中创建所需的附加列,类似于上面的滞后函数。

或者您可以将其放入电子表格中,这样更容易检测公式填充列 =if(a2<>a1,1,0) 中的变化。只要确保没有人 re-sorts 将电子表格数据导入新订单!