If statement 从另一个变量中的条件值创建变量
我有一个相当大的冲突数据集(7100万次观察),包含许多变量和日期(每天) 这来自GDELT项目,数据集的结构是每天都有一个目标国家和一个侵略来源国。也就是说,在2000年1月1日,许多国家对他人或自己进行了侵略行为,这一数据集跟踪了这一情况 看起来是这样的: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
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
是一种冲突强度级别,通过某种跟踪每种语言新闻的算法来衡量
我所追求的是创建一个新的(每个国家)变量,如果某个特定国家作为源或目标参与,该变量将提取该事件的客串代码
对于这个具体的例子,下面是我对印度案例(codeIND
)的期望输出,该案例在特定日期涉及两个事件:
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
或类似的日期。