Дублирование записей данных по идентификатору, если они удовлетворяют определенному условию

#stata

#stata

Вопрос:

В исходном наборе данных выбора фиксируются лица ( 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 покупки, мне нужно повторить набор выбора три раза, поэтому окончательная структура выглядит как приведенный ниже набор данных.

 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
 

Следовательно, выбор = 1 должен появляться только один раз для каждой транзакции.

Ответ №1:

Ответ не совсем «использовать expand «, поскольку есть нюанс, что вам не нужны точные копии.

 expand sumchoice 
bysort id assortchoice (choice) : replace choice = 0 if _n != _N amp; 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 |
      ----------------------------------- 
 

Комментарии:

1. Большое вам спасибо. Это работает хорошо. Можно ли также создать переменную как «транзакцию», которая указывает порядок транзакций? (Я не могу запустить регрессию без этой части информации.)

2. Что в ваших данных дает эту информацию?

3. Я бы сказал sumchoice (тот, который я сгенерировал, чтобы узнать, сколько транзакций было совершено человеком)

4. Это не обязательно должен быть порядок. Это просто должен быть показатель номера транзакции.

5. Извините, я не понимаю. У вас уже есть sumchoice . choice == 1 указывает на ваш выбор. Но choice == 1 точно такой же, как choice .