问题描述
更新:我很抱歉在前面提供了一个非常简单、不可重现的例子。这是可以复制的东西:
*使用此特定于案例的数据集:
week units pr categ id avecenoz1 avecenoz2 avecenoz3
1667 1 0 1 371247 4.276693 4.871173 6.430658
1686 1 0 1 581457 4.372499 5.042025 6.45528
1656 1 0 2 217025 4.107188 4.900006 6.236501
1649 1 0 2 138704 4.355612 4.920326 6.548411
1685 1 0 3 575278 4.297557 4.971671 6.408175
1642 1 0 3 75440 4.290808 4.848145 6.384848
1655 1 0 3 204879 4.275114 4.905337 6.400794
1667 1 0 3 376364 4.276693 4.871173 6.430658
1671 1 1 3 426125 4.274153 5.001119 6.355516
id是进行购买的客户的唯一客户ID,
猫是指购买所属的产品类别,
Week-购买发生在哪一周,
avecenoz1是特定周内类别1的平均价格,
avecenoz2是特定周内类别2的平均价格,
avecenoz3是特定周内类别3的平均价格,
单位始终等于1
和pr是购买是否在促销(1)或不是(0)。
*Scott Long的用户编写的代码,用于将变量从特定于大小写转换为特定于替换:
case2alt, alt(avecenoz) case(id) choice(categ) altnum(mode)
*这是您得到的:
id mode week units pr cater avecenoz choice y1 y2 y3
75440 1 1642 1 0 3 4.290808 0 1 0 0
75440 2 1642 1 0 3 4.848145 0 0 1 0
75440 3 1642 1 0 3 6.384848 1 0 0 1
138704 1 1649 1 0 2 4.355612 0 1 0 0
138704 2 1649 1 0 2 4.920326 1 0 1 0
138704 3 1649 1 0 2 6.548411 0 0 0 1
204879 1 1655 1 0 3 4.275114 0 1 0 0
204879 2 1655 1 0 3 4.905337 0 0 1 0
204879 3 1655 1 0 3 6.400794 1 0 0 1
217025 1 1656 1 0 2 4.107188 0 1 0 0
217025 2 1656 1 0 2 4.900006 1 0 1 0
217025 3 1656 1 0 2 6.236501 0 0 0 1
371247 1 1667 1 0 1 4.276693 1 1 0 0
371247 2 1667 1 0 1 4.871173 0 0 1 0
371247 3 1667 1 0 1 6.430658 0 0 0 1
376364 1 1667 1 0 3 4.276693 0 1 0 0
376364 2 1667 1 0 3 4.871173 0 0 1 0
376364 3 1667 1 0 3 6.430658 1 0 0 1
426125 1 1671 1 1 3 4.274153 0 1 0 0
426125 2 1671 1 1 3 5.001119 0 0 1 0
426125 3 1671 1 1 3 6.355516 1 0 0 1
575278 1 1685 1 0 3 4.297557 0 1 0 0
575278 2 1685 1 0 3 4.971671 0 0 1 0
575278 3 1685 1 0 3 6.408175 1 0 0 1
581457 1 1686 1 0 1 4.372499 1 1 0 0
581457 2 1686 1 0 1 5.042025 0 0 1 0
581457 3 1686 1 0 1 6.45528 0 0 0 1
如您所见,在转换时,pr被复制了3次。然而,对于每个复制的交易,只有售出的商品的指示符变量应该等于1,而不是其余的选择。请帮我防止公关复制。谢谢!
原始邮件:
我正在将数据集从特定于案例转换为特定于备选方案。原始数据集如下所示:
id category week price1 price2 price3 pr
1 1 1 4.24 4.88 3.35 1
2 2 1 4.24 4.88 3.35 0
3 3 1 4.24 4.88 3.35 1
4 2 1 4.24 4.88 3.35 0
其中:
id是进行购买的客户的唯一客户ID,
类别是指采购所属的产品类别,
Week-购买发生在哪一周,
price1为类别1在特定周内的平均价格,
价格2是类别2在特定一周内的平均价格,
Price3是特定周内类别3的平均价格,
和pr是购买是否在促销(1)或不是(0)。
如何确保公关在转换后不会复制自身?
使用代码
我得到的是:
id mode week cater choice price y1 y2 y3 pr
1 1 1 1 1 4.24 1 0 0 1
1 2 1 1 0 4.88 0 1 0 1
1 3 1 1 0 3.35 0 0 1 1
2 1 1 1 0 4.24 1 0 0 0
2 2 1 1 1 4.88 0 1 0 0
2 3 1 1 0 3.35 0 0 1 0
3 1 1 1 0 4.24 1 0 0 1
3 2 1 1 0 4.88 0 1 0 1
3 3 1 1 1 3.35 0 0 1 1
4 1 1 1 0 4.24 1 0 0 0
4 2 1 1 1 4.88 0 1 0 0
4 3 1 1 0 3.35 0 0 1 0
除公关外,其他工作都很顺利。我不希望它为每个客户ID复制所有可能的替代方案。对于每个复制的交易,只有已售出的商品的指示符变量应该等于1,而不是其余的选择:
id mode week cater choice price y1 y2 y3 pr
1 1 1 1 1 4.24 1 0 0 1
1 2 1 1 0 4.88 0 1 0 0
1 3 1 1 0 3.35 0 0 1 0
2 1 1 1 0 4.24 1 0 0 0
2 2 1 1 1 4.88 0 1 0 0
2 3 1 1 0 3.35 0 0 1 0
3 1 1 1 0 4.24 1 0 0 0
3 2 1 1 0 4.88 0 1 0 0
3 3 1 1 1 3.35 0 0 1 1
4 1 1 1 0 4.24 1 0 0 0
4 2 1 1 1 4.88 0 1 0 0
4 3 1 1 0 3.35 0 0 1 0
可以这样做吗?
非常感谢!
推荐答案
我最初使用merge
的答案应该可以正常工作。下面是一个示例。
clear all
set more off
*----- original data -----
input ///
id catchosen week pricea priceb pricec pr
1 1 1 4.24 4.88 3.35 1
2 2 1 4.24 4.88 3.35 0
3 3 1 4.24 4.88 3.35 1
4 2 1 4.24 4.88 3.35 0
end
list
* modify some things to do a -merge- later on
rename catchosen alt
rename pr pr2
* save this data in a temporary file
tempfile orig
save "`orig'"
*----- data that your command produces -----
clear all
input ///
id alt week cater choice price y1 y2 y3 pr
1 1 1 1 1 4.24 1 0 0 1
1 2 1 1 0 4.88 0 1 0 1
1 3 1 1 0 3.35 0 0 1 1
2 1 1 1 0 4.24 1 0 0 0
2 2 1 1 1 4.88 0 1 0 0
2 3 1 1 0 3.35 0 0 1 0
3 1 1 1 0 4.24 1 0 0 1
3 2 1 1 0 4.88 0 1 0 1
3 3 1 1 1 3.35 0 0 1 1
4 1 1 1 0 4.24 1 0 0 0
4 2 1 1 1 4.88 0 1 0 0
4 3 1 1 0 3.35 0 0 1 0
end
* merge this data with the original data. keep only -pr2-
merge 1:1 id alt using "`orig'", keepusing(pr2)
replace pr2 = 0 if missing(pr2)
* compare -pr- with -pr2-. the latter is what you want.
list, sepby(id)
但正如Joe Canner在Statalist.org中指出的,一个简单的:
replace pr = 0 if choice == 0
执行case2alt
后,也应该可以工作,而且要简单得多。
这篇关于在特定于备选方案的数据组织过程中,如何避免某个变量重复?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!