按组比较最后一行和前一行并填充新列
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:
- 不是组的第一行
- 当前值与之前的值不同。
语法 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 将电子表格数据导入新订单!
我需要将组的最后一行与其上面的行进行比较,查看是否有几列发生变化,如果发生变化,则用 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:
- 不是组的第一行
- 当前值与之前的值不同。
语法 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 将电子表格数据导入新订单!