我有这样的数据
year month X Y weight
2013 1 1 0 1000
2001 12 0 1 2000
我想基于Z
和X
变量创建变量Y
,条件为year
。我在2002年之前和之后有两个year
公式。如果我将egen
与if
一起使用,
if year > 2002 {
bysort year month :egen Z= total( x*weight)
}
else {
bysort year month : egen Z= total(y*weight*0.5)
}
此代码不起作用,因为如果year <2002
,Stata会报告已创建z
。有没有办法实现这个目标?
我用一种非常粗暴和暴力的方法来解决这个问题。我为z创建了两个变量,即z和z_2002。如果年份小于2002年,我用z_2002替换z。
答案 0 :(得分:0)
clear
input year month x y weight
2013 1 1 0 1000
2001 12 0 1 2000
end
preserve
keep if year>2002
bysort year month :egen z= total(x*weight)
tempfile t1
save `t1'
restore
keep if year<=2002
bysort year month : egen z= total(y*weight*0.5)
append using `t1'
list
答案 1 :(得分:0)
如果我理解正确,这应该有效。
在第一步(以年为条件)和第二步中的总和计算产品。
正如其他答案已经注意到的那样,if
限定符和if
编程命令之间存在差异。有一个简短的常见问题解答:http://www.stata.com/support/faqs/programming/if-command-versus-if-qualifier/。
(我在另一个答案的评论中使用@NickCox提供的代码。)
clear all
set more off
*----- example data -----
input year month x y weight
2013 1 1 0 1000
2013 1 1 0 800
2013 2 0 1 1200
2013 2 1 0 1400
2001 12 1 0 1500
2001 12 0 1 2000
2001 11 1 1 4000
end
sort year month
list, sepby(year month)
*----- computations -----
gen Z = cond(year > 2002, x * weight, y * weight * 0.5)
bysort year month: egen totZ = total(Z) // already sorted so -by- should be enough
list, sepby(year month)