If statement 从另一个变量中的条件值创建变量

If statement 从另一个变量中的条件值创建变量,if-statement,subset,stata,qualifiers,If Statement,Subset,Stata,Qualifiers,我有一个相当大的冲突数据集(7100万次观察),包含许多变量和日期(每天) 这来自GDELT项目,数据集的结构是每天都有一个目标国家和一个侵略来源国。也就是说,在2000年1月1日,许多国家对他人或自己进行了侵略行为,这一数据集跟踪了这一情况 看起来是这样的: clear input long date_01 str18 source_01 str19 target_01 str4 cameocode_01 20000101 "AFG" "AFGGOV" "020" 20000101

我有一个相当大的冲突数据集(7100万次观察),包含许多变量和日期(每天)

这来自GDELT项目,数据集的结构是每天都有一个目标国家和一个侵略来源国。也就是说,在2000年1月1日,许多国家对他人或自己进行了侵略行为,这一数据集跟踪了这一情况

看起来是这样的:

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
我想做的是在每个国家隔离这些事件

例如,我想为美国创建一个变量,其中,对于每个日期,我都有美国作为目标或来源的所有时间,以及它们各自的客串代码。我有相当多的国家,但只需要其中的一个子集,我知道他们的名字提前

正如您在示例中所看到的,第一个变量是date,对于这些单元格,它始终是
2000101
,但经过数百次观察后,它变为
2000102
,表示一天的变化

第二个变量
source_01
是一个国家攻击另一个国家。在本例中,
IND
是印度,
AFG
是阿富汗,其他代码是其他国家

第三个变量
target_01
只是冲突的受害者

最后,
cameocode_01
是一种冲突强度级别,通过某种跟踪每种语言新闻的算法来衡量

我所追求的是创建一个新的(每个国家)变量,如果某个特定国家作为源或目标参与,该变量将提取该事件的客串代码

对于这个具体的例子,下面是我对印度案例(code
IND
)的期望输出,该案例在特定日期涉及两个事件:

date      INDIAcameo
20000101  "042" 
20000101  "043"
我试过这个:

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

但是,它说类型不匹配,我怀疑它是否能提供我所需要的信息。

如果您事先知道您感兴趣的国家,那么以下方法将起作用:

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           |
     +-------------------------------------------------------------------------------+


如果您事先知道您感兴趣的国家,那么以下措施将起作用:

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           |
     +-------------------------------------------------------------------------------+


请注意,这些日期不适合任何严肃的用途,如果您考虑一下从20000131跳到20000201以及从20000231跳到20010101时会发生什么,这一点就很清楚了。合适的每日日期由
gen better_date=daily(string(date_01,“%8.0f”),“YMD”)
给出,后跟
format better_date%td
或类似的日期。请注意,这些日期不适合任何严肃的用途,如果您考虑从20000131跳到20000201以及从20000231跳到20010101时会发生什么,这一点会很清楚。合适的每日日期将由
gen better\u date=daily(字符串(date\u 01,“%8.0f”),“YMD”)
给出,后跟
format better\u date%td
或类似的日期。