代码之家  ›  专栏  ›  技术社区  ›  bill999

检测重复项

  •  0
  • bill999  · 技术社区  · 11 年前

    我的问题是检测重复项。假设我有以下数据:

    clear all
    input str2 pos str10 name 
    A Joe
    A Joe
    B Frank
    C Mike
    C Ted
    D Mike
    D Mike
    E Bill
    F Bill
    end
    

    如果我想检测所有重复的名称,我只需键入:

    duplicates tag name, gen(flag)
    

    这给了我:

    pos name  flag
    A   Joe   1
    A   Joe   1
    B   Frank 0
    C   Mike  2
    C   Ted   0
    D   Mike  2
    D   Mike  2
    E   Bill  1
    F   Bill  1
    

    太好了-这表明 Joe , Mike Bill 是重复的。

    但是,假设我不想包含任何仅在 pos 换句话说,我不想发现 重复,因为Joe只出现在 销售时点情报系统 A 。我只想找到那个 迈克 账单 是重复的。(当 迈克 在中重复 D ,他也出现在 C ,所以他出现在不止一个 销售时点情报系统 .)

    换句话说,我希望:

    pos name  flag
    A   Joe   0
    A   Joe   0
    B   Frank 0
    C   Mike  1
    C   Ted   0
    D   Mike  1
    D   Mike  1
    E   Bill  1
    F   Bill  1
    

    注意这里 迈克 flag 仅第个,共个 1 而不是 2 。那是因为我正在治疗 迈克 在里面 D 因为只出现一次而不是两次。有 2. 而不是 1. 如果解决方案产生这种情况,则没有问题。

    有办法做到这一点吗?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Nick Cox    11 年前

    这不再是特定意义上的重复问题 duplicates 。(免责声明:我最初写的。)

    您只想知道给定的名称是否出现在不同的组中。这一问题在不同的地方得到了审查,例如 here .

    一种方法是标记 name pos 只需一次,然后分组计数。

    clear 
    input str1 pos str5 name  flag
    A   Joe   1
    A   Joe   1
    B   Frank 0
    C   Mike  2
    C   Ted   0
    D   Mike  2
    D   Mike  2
    E   Bill  1
    F   Bill  1
    end 
    egen tag = tag(name pos) 
    egen npos = total(tag), by(name) 
    list , sepby(pos) 
    
         +---------------------------------+
         | pos    name   flag   tag   npos |
         |---------------------------------|
      1. |   A     Joe      1     1      1 |
      2. |   A     Joe      1     0      1 |
         |---------------------------------|
      3. |   B   Frank      0     1      1 |
         |---------------------------------|
      4. |   C    Mike      2     1      2 |
      5. |   C     Ted      0     1      1 |
         |---------------------------------|
      6. |   D    Mike      2     1      2 |
      7. |   D    Mike      2     0      2 |
         |---------------------------------|
      8. |   E    Bill      1     1      2 |
         |---------------------------------|
      9. |   F    Bill      1     1      2 |
         +---------------------------------+
    

    有些人可能希望看到一个没有 egen :

    bysort name pos: gen tag = _n == 1 
    by name: gen npos = sum(tag) 
    by name replace npos = npos[_N]  
    

    只需使用一个新变量即可重写:

    bysort name pos: gen npos = _n == 1 
    by name: replace npos = sum(npos) 
    by name: replace npos = npos[_N]