我需要比较一个组的最后一行和它上面的行,看看是否有一些列发生了变化,如果发生了变化,用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建模。想让事情简短甜蜜。
2条答案
按热度按时间db2dz4w81#
使用data step和lag语句。确保首先按组对数据进行排序,并且按正确的顺序对组中的行进行排序。使用数组将使代码变得更小。
下面的逻辑将把每一行与前一行进行比较。只有在下列情况下,才会设置标志1:
这不是小组的第一排
当前值与以前的值不同。
语法
var = (test logic);
是自动生成虚拟标志的快捷方式。vawmfj5a2#
对于过程编程人员来说,在sql中发现这种进退两难的情况并不少见,sql主要是一种集合语言,其中行没有位置。如果您编写一个过程来读取select数据(按所需顺序排序),那么它可以使用变量来控制在输出中创建所需的附加列,类似于上面的lag函数。
或者你可以把它放到一个电子表格中,这样更容易检测到公式填充列=if(a2<>a1,1,0)的变化。只需确保没有人将电子表格数据重新排序为新的顺序!