Создание переменной из условных значений в другом - PullRequest
1 голос
/ 01 мая 2019

У меня довольно большой набор данных о конфликтах (71 миллион наблюдений) со многими переменными и датой (ежедневно).

Это из проекта GDELT, для которого структурирован набор данных так, что на каждый день существует целевая страна и страна-источник агрессии. А именно, первое января 2000 года многие страны вели агрессивное поведение по отношению к другим или к самим себе, и этот набор данных отслеживает это.

Это выглядит так:

clear

input long date_01 str18 source_01 str19 target_01 str4 cameocode_01
20000101 "AFG"    "AFGGOV" "020" 
20000101 "AFG"    "AFGGOV" "0841"
20000101 "AFG"    "ARE"    "036" 
20000101 "AFG"    "CVL"    "043" 
20000101 "AFG"    "GOV"    "010" 
20000101 "AFG"    "GOV"    "043" 
20000101 "AFGGOV" "kasUAF" "0353"
20000101 "AFGGOV" "kasUAF" "084" 
20000101 "AFG"    "IGOUNO" "030" 
20000101 "AFG"    "IND"    "042" 
20000101 "AFG"    "IND"    "043" 
end

То, что я хотел бы сделать, это выделить эти события для каждой страны.

Например, я хотел бы создать переменную для США, где для каждой даты у меня есть все времена, когда США были либо целью, либо источником, и их соответствующий код камеи. У меня есть значительное количество стран, но мне нужно только их подмножество, и я заранее знаю их названия.

Как видно из примера, первая переменная - это дата, которая для этих ячеек всегда равна 2000101, но после нескольких сотен наблюдений она меняется на 2000102, обозначая изменение дня.

Вторая переменная source_01 - это страна, нападающая на другую. В этом примере IND - это Индия, AFG - это Афганистан, а другие коды - это другие страны.

Третья переменная target_01 является просто жертвой конфликта.

Наконец, cameocode_01 - это уровень интенсивности конфликта, измеряемый некоторым алгоритмом, который отслеживает новости на каждом языке.

Я хочу создать новую переменную (для каждой страны), которая извлекает камео-код этого события, если в качестве источника или цели используется конкретная страна.

Для этого конкретного примера ниже приведен желаемый результат для Индии (код IND), который участвует в двух событиях в конкретную дату:

date      INDIAcameo
20000101  "042" 
20000101  "043"

Я пробовал это:

replace INDIA cameo=cameocode if "target"  ~ "source" ==IND

Однако, это говорит о несоответствии типов, и я сомневаюсь, что это все равно даст мне то, что я ищу.

1 Ответ

2 голосов
/ 01 мая 2019

Если вы заранее знаете интересующие вас страны, сработает следующее:

clear

input long date_01 str18 source_01 str19 target_01 str4 cameocode_01
20000101 "AFG"    "AFGGOV" "020" 
20000101 "AFG"    "IND"    "043"
20000101 "AFG"    "AFGGOV" "0841"
20000101 "AFG"    "ARE"    "036" 
20000101 "AFG"    "CVL"    "043" 
20000101 "AFG"    "GOV"    "010" 
20000101 "AFG"    "GOV"    "043" 
20000101 "AFGGOV" "kasUAF" "0353"
20000101 "AFGGOV" "kasUAF" "084" 
20000101 "AFG"    "IGOUNO" "030" 
20000102 "AFG"    "IND"    "042" 
end

foreach c in AFG IND ARE {
    generate ind_`c' = cameocode_01 if strmatch(source_01, "`c'") |  ///
                                       strmatch(target_01, "`c'")
}

Обратите внимание, что я немного изменил ваш пример для лучшей иллюстрации.

Чтобы увидеть результаты:

list, sepby(date) abbreviate(15)

     +-------------------------------------------------------------------------------+
     |  date_01   source_01   target_01   cameocode_01   ind_AFG   ind_IND   ind_ARE |
     |-------------------------------------------------------------------------------|
  1. | 20000101         AFG      AFGGOV            020       020                     |
  2. | 20000101         AFG         IND            043       043       043           |
  3. | 20000101         AFG      AFGGOV           0841      0841                     |
  4. | 20000101         AFG         ARE            036       036                 036 |
  5. | 20000101         AFG         CVL            043       043                     |
  6. | 20000101         AFG         GOV            010       010                     |
  7. | 20000101         AFG         GOV            043       043                     |
  8. | 20000101      AFGGOV      kasUAF           0353                               |
  9. | 20000101      AFGGOV      kasUAF            084                               |
 10. | 20000101         AFG      IGOUNO            030       030                     |
     |-------------------------------------------------------------------------------|
 11. | 20000102         AFG         IND            042       042       042           |
     +-------------------------------------------------------------------------------+

или

foreach v of varlist ind* {
    sort date `v'
    list date `v' if !missing(`v'), sepby(date) abbreviate(15)
}

     +--------------------+
     |  date_01   ind_AFG |
     |--------------------|
  3. | 20000101       010 |
  4. | 20000101       020 |
  5. | 20000101       030 |
  6. | 20000101       036 |
  7. | 20000101       043 |
  8. | 20000101       043 |
  9. | 20000101       043 |
 10. | 20000101      0841 |
     |--------------------|
 11. | 20000102       042 |
     +--------------------+

     +--------------------+
     |  date_01   ind_IND |
     |--------------------|
 10. | 20000101       043 |
     |--------------------|
 11. | 20000102       042 |
     +--------------------+

     +--------------------+
     |  date_01   ind_ARE |
     |--------------------|
 10. | 20000101       036 |
     +--------------------+
...