1

我的 Stata 数据集包含对不同玩家在模拟中创建的产品组成组件的观察。我想只保留由不同且独特的组件组成的产品(由每个玩家创建),即识别在所有变量上不同的观察结果(按 player_id)。

数据是:

+---------+-----------+------------+------------+- ------------+
| 产品 | 玩家ID | 组件1 | 组件2 | 组件3 |
+---------+-----------+------------+------------+- ------------+
| 1 | 1 | 1 | 2 | 3 |
| 2 | 1 | 1 | 5 | 9 |
| 3 | 1 | 7 | 8 | 9 |
| 4 | 2 | 4 | 5 | 6 |
| 5 | 2 | 4 | 5 | 9 |
| 6 | 2 | 7 | 8 | 9 |
+---------+-----------+------------+------------+- ------------+

理想的结果应该让我有以下结果:

+---------+-----------+------------+------------+- ------------+
| 产品 | 玩家ID | 组件1 | 组件2 | 组件3 |
+---------+-----------+------------+------------+- ------------+
| 1 | 1 | 1 | 2 | 3 |
| 3 | 1 | 7 | 8 | 9 |
| 4 | 2 | 4 | 5 | 6 |
| 6 | 2 | 7 | 8 | 9 |
+---------+-----------+------------+------------+- ------------+

可以看出,产品 2 应该被删除,因为它与产品 1 有共同的组件 1,与产品 3 有共同的组件 3;同样,应该删除产品 5,因为它与产品 4 共享组件 1 和 2,而与产品 6 共享组件 3。

其余产品(按玩家)应保留,因为它们使用不同的非重叠组件。

4

1 回答 1

2

对于每个不同的播放器来说,每个组件的组合都是全新的,所有组件都为该播放器首次出现是必要且充分的。因此,我们跟踪每个组件的第一次出现,并在该组件以后出现时丢弃任何观察。

相同的玩具数据(但变量名更短):

input Product Player_id C1 C2 C3 
   1          1           1           2           3 
   2          1           1           5           9 
   3          1           7           8           9 
   4          2           4           5           6 
   5          2           4           5           9 
   6          2           7           8           9 
end 

目前尚不清楚是否Product与观察数起相同的作用:不管怎样,我们都可以创建一个变量来保存观察数。

gen long obs = _n 

现在我们要循环组件,在这个例子中是 9 个。

qui forval i = 1/9 { 

对于每个组件:找到它是否是三个组件中的任何一个。这是一个指示变量,如果为真,则为 1,如果为假,则为 0:

    gen found = C1 == `i' | C2 == `i' | C3 == `i' 

有一个简洁的选择:

    gen found = inlist(`i', C1, C2, C3) 

我们想要跟踪第一次出现,如果found为真,这是最小观察次数,我们分别通过Player_id. 指示变量在此处的除法产生obsiffound为 1,否则为缺失。egen除非所有值都作为缺失值返回,否则缺失值将被忽略。

    egen first = min(obs / found), by(Player_id) 

现在我们要做的是drop如果它们不是第一次发生,以及drop我们的会计变量,所以它们可以在下一次循环中重新创建:

    drop if obs > first & found
    drop first found 
} 

结果如下:

      +-----------------------------------------+
      | Product   Player~d   C1   C2   C3   obs |
      |-----------------------------------------|
   1. |       1          1    1    2    3     1 |
   2. |       3          1    7    8    9     3 |
   3. |       4          2    4    5    6     4 |
   4. |       6          2    7    8    9     6 |
      +-----------------------------------------+

请注意,此算法对观察的顺序很敏感。如果你从那开始,1 5 9那么两者都不是,1 2 3或者7 8 9是可以接受的。4 5 9与;类似 4 5 6不要7 8 9削减。

于 2013-08-20T17:45:35.980 回答