首页 > 解决方案 > 按 id 保存重复项

问题描述

我在Stata中有两个变量,id并且price

id price
1  4321
1  7634
1  7974
1  7634
1  3244
2  5943
2  3294
2  5645
2  3564
2  4321
2  4567
2  4567
2  4567
2  4567
3  5652
3  9586
3  5844
3  8684
3  2456
4  7634

通常我可以使用该duplicates命令来获取变量的重复观测值。

但是,如何创建一个新变量来保存pricefor each的重复项id

标签: stata

解决方案


我没有理由认为可以duplicates使用by:. duplicates无论price id您的示例的一般配方是什么,共同检查两个变量的重复项。考虑

clear 
input id price
1  4321
1  7634
1  7974
1  7634
1  3244
2  5943
2  3294
2  5645
2  3564
2  4321
2  4567
2  4567
2  4567
2  4567
3  5652
3  9586
3  5844
3  8684
3  2456
4  7634
end 

. duplicates example id price 

Duplicates in terms of id price

  +------------------------------------+
  | group:   #   e.g. obs   id   price |
  |------------------------------------|
  |      1   2          2    1    7634 |
  |      2   4         11    2    4567 |
  +------------------------------------+

. duplicates tag id price, gen(tag) 

Duplicates in terms of id price

. list id price if tag , sepby(id) 

     +------------+
     | id   price |
     |------------|
  2. |  1    7634 |
  4. |  1    7634 |
     |------------|
 11. |  2    4567 |
 12. |  2    4567 |
 13. |  2    4567 |
 14. |  2    4567 |
     +------------+

除此之外,我不清楚您希望看到什么输出或数据结果。

编辑作为对评论的回应,这里有两种更直接的方法。duplicates基于这样的想法,即重复大多是不需要的;你似乎有相反的观点,在这种情况下duplicates与你的需求是倾斜的。

* approach 1 
bysort price id : gen wanted = _n == 1 & _N > 1 

list if wanted 

     +---------------------+
     | id   price   wanted |
     |---------------------|
  7. |  2    4567        1 |
 15. |  1    7634        1 |
     +---------------------+

* approach 2 
drop wanted 

bysort price id : keep if _n == 1 & _N > 1 

list 

     +------------+
     | id   price |
     |------------|
  1. |  2    4567 |
  2. |  1    7634 |
     +------------+

当然,如果您想进一步复制数据(为什么?),那么在方法 1 之后

gen duplicated_price = price if wanted 

为您提供一个新变量中每个重复值的副本。这是@Pearly Spencer 方法的稍微简单的等价物。

bysort price id : gen duplicated_price = price if _n == 1 & _N > 1 

在一行中完成。


推荐阅读