Stata比较列表并找到缺失的数字

时间:2014-10-14 17:43:17

标签: list loops stata

我有一个问题可能非常简单,但我现在无法解决。

我有两个很长的索引号列表,它们是相同的,除了第一个列表包含第二个列表没有的一些数字,因此顺序也不同。

以下是两个列表的示例:

   index1   index2
    10002   10005
    10005   10006
    10006   10009
    10009   10025
    10019   10028
    10020   10048
    10025   10050

有没有什么方法可以找到第一个列表中但在第二个列表中丢失的索引号?我尝试使用循环,但改变顺序使它变得非常困难。

手动不是一个选项,因为列表超过7000个数字。

谢谢!

2 个答案:

答案 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 listshelp 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 |
     +---------------+