我进行了电话调查,这是我数据集的原型:
var1 var2
6666 1
6666 2
7676 2
7676 1
8876 1
8876 2
89898 1
89898 2
9999 1
9999 2
5656 1
5656 2
2323 1
2323 2
9876 1
7654 1
var1
是我调查中每个案例的唯一标识符(在本例中为电话号码)。
var2
是调查的结果:1(成功),2(未成功)。
我希望保留每个var1
var2 == 1
的观察结果,但保留var1
var2 == 2
的观察结果,如果没有var2 == 1
duplicates drop var1 if var2 == 2, force
}。
我试过了
{{1}}
但我没有得到所需的输出
答案 0 :(得分:1)
这个问题标题错误:你不想覆盖任何东西。
您的语法无法正常工作,因为它不是您想要的。你问的是var1 if var2 == 2
是否有重复,而且该命令对var2 == 1
的观察没有任何关注。
您的示例不包含var2 == 2
的观察结果,但var2 == 1
没有相应的观察结果。我添加了一个这样的。
这是实现目标的一种方式。我顺便说明你所拥有的duplicates
命令对这个例子没有任何作用;也不会期望做任何事情。
. clear
. input var1 var2
var1 var2
1. 6666 1
2. 6666 2
3. 7676 2
4. 7676 1
5. 8876 1
6. 8876 2
7. 89898 1
8. 89898 2
9. 9999 1
10. 9999 2
11. 5656 1
12. 5656 2
13. 2323 1
14. 2323 2
15. 9876 1
16. 7654 1
17. 42 2
18. end
. duplicates list var1 if var2 == 2
Duplicates in terms of var1
(0 observations are duplicates)
. bysort var1 (var2) : assert _N == 1 | _N == 2
. by var1 : drop if _n == 2 & var2[2] == 2
(7 observations deleted)
. list, sepby(var1)
+--------------+
| var1 var2 |
|--------------|
1. | 42 2 |
|--------------|
2. | 2323 1 |
|--------------|
3. | 5656 1 |
|--------------|
4. | 6666 1 |
|--------------|
5. | 7654 1 |
|--------------|
6. | 7676 1 |
|--------------|
7. | 8876 1 |
|--------------|
8. | 9876 1 |
|--------------|
9. | 9999 1 |
|--------------|
10. | 89898 1 |
+--------------+
另一种方法是
. bysort var1 (var2) : keep if _n == 1 & var2[2] == 2
实际上
. bysort var1 (var2): keep if _n == 1
如果有var2 == 1
,会保留观察结果,否则会保留var2 == 2
的单身人士。
隐藏的假设似乎包含每个不同var1
的最多两个观察结果。请注意使用assert
来检查有关数据集的假设。