问题描述
在 Stata 中,quantity
有以千克和克为单位的输入。 unit =1
表示公斤,unit=2
表示克。我如何generate
一个新变量quantity_kg
将所有克值转换为公斤?
My existing dataset-
clear
input double(hhid quantity unit unit_price)
1 24 1 .
1 4 1 .
1 350 2 50
1 550 2 90
1 2 1 65
1 3.5 1 85
1 1 1 20
1 4 1 25
1 2 1 .
2 1 1 30
2 2 1 15
2 1 1 20
2 250 2 10
2 2 1 20
2 400 2 10
2 100 2 60
2 1 1 20
我期望的数据集
input double(hhid quantity unit unit_price quantity_kg)
1 24 1 . 24
1 4 1 . 4
1 350 2 50 .35
1 550 2 90 .55
1 2 1 65 2
1 3.5 1 85 3.5
1 1 1 20 1
1 4 1 25 4
1 2 1 . 2
2 1 1 30 1
2 2 1 15 2
2 1 1 20 1
2 250 2 10 .25
2 2 1 20 2
2 400 2 10 .40
2 100 2 60 .10
2 1 1 20 1
解决方法
下面的代码可以满足您的需求。
这看起来像是家庭数据,通常需要进行大量单位转换。它们也是一个常见的错误来源,因此我包含了在本地定义转换率和单位代码的最佳实践。如果您在一个地方定义它,那么您可以在转换单位的多个地方重复使用这些局部变量。很容易在带有 replace
的行中发现拼写错误,因为您会注意到,如果一行写着 kilo_rate
而后写着 gram_unit
。在这个简单的例子中,它可能有点矫枉过正,但如果你有很多单位和费率,那么这是一种避免错误的巧妙方法。
clear
input double(hhid quantity unit unit_price)
1 24 1 .
1 4 1 .
1 350 2 50
1 550 2 90
1 2 1 65
1 3.5 1 85
1 1 1 20
1 4 1 25
1 2 1 .
2 1 1 30
2 2 1 15
2 1 1 20
2 250 2 10
2 2 1 20
2 400 2 10
2 100 2 60
2 1 1 20
end
*Define conversion rates and unit codes
local kilo_rate = 1
local kilo_unit = 1
local gram_rate = 0.001
local gram_unit = 2
*Create the standardized variable
gen quantity_kg = .
replace quantity_kg = quantity * `kilo_rate' if unit == `kilo_unit'
replace quantity_kg = quantity * `gram_rate' if unit == `gram_unit'
,
// unit 1 means kg,unit 2 means g,and 1000 g = 1 kg
generate quantity_kg = cond(unit == 1,quantity,cond(unit == 2,quantity/1000,.))
您的示例在 unit
上没有任何缺失值,但想象它们可能发生也无妨。
以解释的方式提供评论对于第三方来说可能是多余的,也可能是必不可少的。