按ID保存重复项

时间:2018-09-16 20:20:12

标签: stata

我在Stata中有两个变量idprice

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命令来获取变量的重复观测值。

但是,如何创建一个新变量来保存重复项 每个price的{​​{1}}中有多少?

2 个答案:

答案 0 :(得分:2)

duplicates命令不适用于bysort,因此您必须使用 一种不同的方法:

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

bysort price id : generate tag = cond(_N == 1, 0, _n)

以上代码段使用cond()函数创建一个指标变量,每个price都出现id的每个重复值。

完成上述步骤后,您只需generate第一次出现的新变量:

bysort price id : generate dup_price = price if tag == 1

或一行:

bysort price id : generate dup_price = price if cond(_N == 1, 0, _n) == 1

两种方法都产生相同的结果:

sort dup_price 
list dup_price if _n < 3, abbreviate(15)

     +-----------+
     | dup_price |
     |-----------|
  1. |      4567 |
  2. |      7634 |
     +-----------+

答案 1 :(得分:1)

我没有理由让duplicatesby:一起使用。 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 

一行完成。