使用首次出现 ID 标记重复项

Tag duplicates with first occurrence ID

我正在使用 cluster 命令,但由于内存不足而遇到困难。为了解决这个问题,我想删除所有重复的观察结果。

我想通过变量 A、B 和 C 进行聚类,我这样识别重复值:

   /* Create dummy data */
     input id A B C
        1 1 1 1
        2 1 1 1
        3 1 1 1
        4 2 2 2
        5 2 2 2
        6 2 2 2
        7 2 2 2 
        8 3 3 3
        9 3 3 3
        10 4 4 4
        end

sort A B C id

duplicates tag A B C, gen(dup_tag)

我想添加一个变量 dup_ID,它告诉我 ids 2 和 3 是 id 1、ids 5 和 6 的副本id4个,以此类推。我该怎么做?

/* Desired result */

id A  B  C  dup_id
1  1  1  1  1
2  1  1  1  1
3  1  1  1  1
4  2  2  2  4
5  2  2  2  4
6  2  2  2  4
7  2  2  2  4
8  3  3  3  8
9  3  3  3  8
10 4  4  4  10

duplicates 是一个很棒的命令(请参阅其手册条目以了解我为什么这么说),但您可以直接执行此操作:

bysort A B C : gen tag = _n == 1

将第一次出现的 A B C 标记为 1,将所有其他标记为 0。反之,使用 _n > 1_n != 1 或其他。

编辑:

那么 id 标记的观察结果就是

by A B C: gen dup_id = id[1] 

有关 by: 的基本技术,请参阅(例如)this discussion

您可以在 ID 上使用下标 [1] 引用每组 A B C 中的第一个观察值。请注意 bysort 中的 (id) 参数,它按 id 排序,但仅按 ABC 来标识组。

clear
input id A B C
1 1 1 1
2 1 1 1
3 1 1 1
4 2 2 2
5 2 2 2
6 2 2 2
7 2 2 2 
8 3 3 3
9 3 3 3
10 4 4 4
end

bysort A B C (id): gen dup_id = id[1]
li, noobs sepby(dup_id)

屈服

  +-------------------------+
  | id   A   B   C   dup_id |
  |-------------------------|
  |  1   1   1   1        1 |
  |  2   1   1   1        1 |
  |  3   1   1   1        1 |
  |-------------------------|
  |  4   2   2   2        4 |
  |  5   2   2   2        4 |
  |  6   2   2   2        4 |
  |  7   2   2   2        4 |
  |-------------------------|
  |  8   3   3   3        8 |
  |  9   3   3   3        8 |
  |-------------------------|
  | 10   4   4   4       10 |
  +-------------------------+