我在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
命令来获取变量的重复观测值。
但是,如何创建一个新变量来保存重复项
每个price
的{{1}}中有多少?
答案 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)
我没有理由让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
一行完成。