我的Stata数据集包含对模拟中不同玩家创建的产品的构成组件的观察。 我想只保留由不同且独特的组件组成的产品(由每个参与者创建),即 识别所有变量不同的观察结果(通过player_id)。
数据是:
+---------+-----------+------------+------------+------------+ | Product | Player id | Component1 | Component2 | Component3 | +---------+-----------+------------+------------+------------+ | 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 | +---------+-----------+------------+------------+------------+
理想的结果应该让我有以下结果:
+---------+-----------+------------+------------+------------+ | Product | Player id | Component1 | Component2 | Component3 | +---------+-----------+------------+------------+------------+ | 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。
应保留剩余的产品(由玩家),因为它们使用不同的非重叠组件。
答案 0 :(得分: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
进行。如果obs
为1,则指示符变量在此处的除法产生found
,否则将丢失。除非所有值都返回为缺失值,否则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
不会削减。