首页 > 解决方案 > 如果满足特定条件,则按 id 复制数据条目

问题描述

在原始选择数据集中,个人(id)被捕获choice在所有可能的产品选项(assortchoice是产品代码)中进行购买( )。每个人总是面临着同一套产品可供选择;因此, 的值choice始终为 0 或 1(“是否选择了产品?”)。

clear
input
id  assortchoice    choice  sumchoice
2   12  1   2
2   13  0   2
2   14  0   2
2   15  0   2
2   16  0   2
2   17  0   2
2   18  0   2
2   19  0   2
2   20  0   2
2   21  0   2
2   22  0   2
2   23  1   2

3   12  1   1
3   13  0   1
3   14  0   1
3   15  0   1
3   16  0   1
3   17  0   1
3   18  0   1
3   19  0   1
3   20  0   1
3   21  0   1
3   22  0   1
3   23  0   1

4   12  1   3
4   13  0   3
4   14  1   3
4   15  1   3
4   16  0   3
4   17  0   3
4   18  0   3
4   19  0   3
4   20  0   3
4   21  0   3
4   22  0   3
4   23  0   3
end

我创建了以下代码来了解每个人做了多少选择:

egen sumchoice=total(choice), by(id)

在这个例子中,个人 3​​ (id=3) 只选择了一种产品(因为 sumchoice=1),但个人 2 做了两种选择(sumchoice=2)。最后,个人 4 做了三个选择(sumchoice=3)。

由于这是一个选择数据,我需要将多项选择的所有实例转换为单项选择集

我的意思是:如果一个人做了两次购买,我需要为那个人复制两次选择集;对于一个购买了 3 次的个人,我需要将选择集复制 3 次,所以最终的结构看起来像下面的数据集。

clear
input
id  transaction assortchoice    choice
2   1   12  1
2   1   13  0
2   1   14  0
2   1   15  0
2   1   16  0
2   1   17  0
2   1   18  0
2   1   19  0
2   1   20  0
2   1   21  0
2   1   22  0
2   1   23  0

2   2   12  0
2   2   13  0
2   2   14  0
2   2   15  0
2   2   16  0
2   2   17  0
2   2   18  0
2   2   19  0
2   2   20  0
2   2   21  0
2   2   22  0
2   2   23  1
            
3   1   12  1
3   1   13  0
3   1   14  0
3   1   15  0
3   1   16  0
3   1   17  0
3   1   18  0
3   1   19  0
3   1   20  0
3   1   21  0
3   1   22  0
3   1   23  0
            
4   1   12  1
4   1   13  0
4   1   14  0
4   1   15  0
4   1   16  0
4   1   17  0
4   1   18  0
4   1   19  0
4   1   20  0
4   1   21  0
4   1   22  0
4   1   23  0
            
4   2   12  0
4   2   13  0
4   2   14  1
4   2   15  0
4   2   16  0
4   2   17  0
4   2   18  0
4   2   19  0
4   2   20  0
4   2   21  0
4   2   22  0
4   2   23  0
            
4   3   12  0
4   3   13  0
4   3   14  0
4   3   15  1
4   3   16  0
4   3   17  0
4   3   18  0
4   3   19  0
4   3   20  0
4   3   21  0
4   3   22  0
4   3   23  0

end

***更新:

transaction指示这是哪个交易订单:

bysort id assortchoice (choice): gen transaction=_n

因此,choice=1 应该在每个事务中只出现一次。

标签: stata

解决方案


答案并不完全是“使用expand”,因为您不想要精确复制。

expand sumchoice 
bysort id assortchoice (choice) : replace choice = 0 if _n != _N & choice == 1 
list if id == 2 , sepby(assortchoice)

     +-----------------------------------+
     | id   assort~e   choice   sumcho~e |
     |-----------------------------------|
  1. |  2         12        0          2 |
  2. |  2         12        1          2 |
     |-----------------------------------|
  3. |  2         13        0          2 |
  4. |  2         13        0          2 |
     |-----------------------------------|
  5. |  2         14        0          2 |
  6. |  2         14        0          2 |
     |-----------------------------------|
  7. |  2         15        0          2 |
  8. |  2         15        0          2 |
     |-----------------------------------|
  9. |  2         16        0          2 |
 10. |  2         16        0          2 |
     |-----------------------------------|
 11. |  2         17        0          2 |
 12. |  2         17        0          2 |
     |-----------------------------------|
 13. |  2         18        0          2 |
 14. |  2         18        0          2 |
     |-----------------------------------|
 15. |  2         19        0          2 |
 16. |  2         19        0          2 |
     |-----------------------------------|
 17. |  2         20        0          2 |
 18. |  2         20        0          2 |
     |-----------------------------------|
 19. |  2         21        0          2 |
 20. |  2         21        0          2 |
     |-----------------------------------|
 21. |  2         22        0          2 |
 22. |  2         22        0          2 |
     |-----------------------------------|
 23. |  2         23        0          2 |
 24. |  2         23        1          2 |
     +-----------------------------------+

推荐阅读