2014-10-14 3 views
1

У меня есть вопрос, который, вероятно, очень прост, но я не могу понять это прямо сейчас.Stata сравнение списков и поиск недостающих чисел

У меня есть два длинных списка индексных номеров, они идентичны, за исключением того факта, что первый список содержит некоторые номера, которые не имеют второго списка, и, следовательно, порядок отличается.

Вот пример двух списков:

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

Есть ли способ, в котором я могу найти номера индексов, которые в первом списке, но отсутствующие во втором? Я пробовал использовать циклы, но изменение порядка делает его довольно сложным.

Вручную не является вариантом, так как список превышает 7000 номеров.

Спасибо!

ответ

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 проверить предел для «# символов в макросе».

+0

Это сделало трюк, спасибо! – user3594343

+0

@ Роберто получает согласие. Мой вклад был «levelsof»! –

2

Другой способ сделать это - stack переменные в один. Это разрушительно, поэтому убедитесь, что набор данных сначала save d. Это создает переменную _stack, теги которой есть. Здесь значения, исходящие от первой переменной, index1, автоматически помечены 1, а те из второй переменной, index2, помечены 2. С другими именами потребуется небольшое вмешательство, чтобы показать соответствие.

Мы можем затем конденсируются набор данных в соответствии с того, происходит ли индекс в 1 только, только 2, или оба, которые мы обозначаем 3.

Вопрос спрашивает о тех, кто в списке 1, но не перечисляют 2, но код сохраняет общность сравнений в обоих направлениях. Если есть индексы в 2, но не 1, вы увидите их. Естественно, вы можете работать с новым набором данных по своему усмотрению.

Еще один способ будет работать с некоторым набором данных с частичной копией самого себя.

. 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 | 
    +---------------+ 
Смежные вопросы