【问题标题】:SAS grouping algorithmSAS分组算法
【发布时间】:2018-05-12 06:31:59
【问题描述】:

我有以下模型表

#n a b group
1  1 1  1
2  1 2  1
3  2 2  1
4  2 3  1
5  3 4  2
6  3 5  2
7  4 5  2   

我正在使用 SAS 来解决这个问题。在列组中,通过 a 和 b 互连的行被分组。我将尝试解释为什么这些行在同一组中

  • 第 1 行到第 2 行在第 2 组中,因为它们的 a = 1
  • 第 3 行在第 2 组中,因为第 2 行和第 3 行中的 b = 2,第 2 行在第 1 组中
  • 第 3 行和第 4 行在第 1 组中,因为两行中 a = 2,第 3 行在第 1 组中

总体逻辑是,如果行 x 包含与行 y 相同的 a 或 b 值,行 x 也属于与 y 所属的同一组。 按照同样的逻辑,第 5,6 和 7 行在第 2 组中。

有没有什么方法可以通过算法找到这些组?

【问题讨论】:

  • 如果有另一个观察到 a=4 和 b=2,你想发生什么?这是否意味着只有一个组?还是您只想按 A、B 的顺序处理行,使其位于第 6 行和第 7 行之间并导致有四个组?
  • ab 是否总是在每个连续的行中增加?如果是,那么 Richard 的回答会起作用,但如果不是,那么这是一个更棘手的问题,需要多次遍历您的数据以识别连接的组件。

标签: algorithm sas


【解决方案1】:

案例一:

分组定义为连续行内的项目链接。

使用 LAG 函数检查两个变量的先验值。如果两者都发生了变化,则增加组值。例如

group + ( a ne lag(a) and b ne lag(b) );

案例二:

根据对所有数据的项目槽值链接确定的分组。

来自grouping pairs by either key

General statement of problem:
-----------------------------
Given: P = p{i} = (p{i,1},p{i,2}), a set of pairs (key1, key2).

Find: The distinct groups, G = g{x}, of P,
      such that each pair p in a group g has this property:

      key1 matches key1 of any other pair in g.
      -or-
      key2 matches key2 of any other pair in g.

演示

…一种使用哈希的迭代方式。 两个哈希维护分配给每个键值的 groupId。 两个额外的哈希用于维护组映射路径。 当数据可以在不引起映射的情况下传递时,组有 已经完全确定。 完成最后一次传递,此时将 groupIds 分配给每个 对,数据输出到表中。

【讨论】:

  • 这仅适用于ab 都相对于n 单调递增的情况。任何像汤姆的例子或例如n=8 a=5 b=4 将无法正确处理。
  • 我的答案不依赖于单一性,它假定所需的分组是按行连续性(在一对项目槽内)——类似于BY ... NOTSORTED
猜你喜欢
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
相关资源
最近更新 更多