我有一个问题可能非常简单,但我现在无法解决。
我有两个很长的索引号列表,它们是相同的,除了第一个列表包含第二个列表没有的一些数字,因此顺序也不同。
以下是两个列表的示例:
index1 index2
10002 10005
10005 10006
10006 10009
10009 10025
10019 10028
10020 10048
10025 10050
有没有什么方法可以找到第一个列表中但在第二个列表中丢失的索引号?我尝试使用循环,但改变顺序使它变得非常困难。
手动不是一个选项,因为列表超过7000个数字。
谢谢!
答案 0 :(得分:2)
如下:
clear
set more off
*----- example data -----
input ///
index1 index2
10002 10005
10005 10006
10006 10009
10009 10025
10019 10028
10020 10048
10025 10050
end
*----- what you want -----
levelsof index1, local(i1)
levelsof index2, local(i2)
local diff: list i1 - i2
display "`diff'"
您想要检查help macro lists
和help limits
以验证宏中#34;字符数的限制"。
答案 1 :(得分:2)
另一种方法是将变量stack
合并为一个。这是破坏性的,因此请确保数据集首先为save
d。这会生成一个变量_stack
,标签就是哪个。此处来自第一个变量index1
的值将自动标记为1,而来自第二个变量index2
的值将被标记为2.使用其他名称时,需要进行一些小的操作来显示对应关系。
然后我们可以根据索引是仅发生在1中,仅发生在2还是两者中来压缩数据集,我们标记为3.
问题是关于列表1中的那些但不是列表2,但是代码保持了两种方式的比较的一般性。如果索引在2但不是1,您将看到它们。您可以根据需要自然地在新数据集中工作。
另一种方法是使用数据集的某些merge
并使用其自身的部分副本。
. clear
. input index1 index2
index1 index2
1. 10002 10005
2. 10005 10006
3. 10006 10009
4. 10009 10025
5. 10019 10028
6. 10020 10048
7. 10025 10050
8. end
. stack index1 index2, into(index) clear
. duplicates drop
Duplicates in terms of all variables
(0 observations are duplicates)
. l
+----------------+
| _stack index |
|----------------|
1. | 1 10002 |
2. | 1 10005 |
3. | 1 10006 |
4. | 1 10009 |
5. | 1 10019 |
|----------------|
6. | 1 10020 |
7. | 1 10025 |
8. | 2 10005 |
9. | 2 10006 |
10. | 2 10009 |
|----------------|
11. | 2 10025 |
12. | 2 10028 |
13. | 2 10048 |
14. | 2 10050 |
+----------------+
. bysort index (_stack) : gen which = cond(_N == 2, 3, _stack)
. bysort index: keep if _n == 1
(4 observations deleted)
. l index which
+---------------+
| index which |
|---------------|
1. | 10002 1 |
2. | 10005 3 |
3. | 10006 3 |
4. | 10009 3 |
5. | 10019 1 |
|---------------|
6. | 10020 1 |
7. | 10025 3 |
8. | 10028 2 |
9. | 10048 2 |
10. | 10050 2 |
+---------------+