Это, вероятно, мой любимый подход:
bysort code year: generate _j = _n
reshape wide product, i(code year) j(_j)
ds product*
egen products = concat(`r(varlist)'), punct(" ")
Приведенный выше фрагмент кода создаст строковую переменную products
по желанию:
list code year products
+--------------------------------------------------------------------+
| code year products |
|--------------------------------------------------------------------|
1. | 15328 2007 Coca-Cola Coca-Cola Diet |
2. | 15328 2008 Pepsi |
3. | 15328 2010 Pepsi Diet Dr Pepper |
4. | 15328 2011 7 Up |
5. | 15328 2012 Aquafina Fanta |
|--------------------------------------------------------------------|
6. | 15328 2013 Amp Energy Manhattan Special Jolt Cola Mountain Dew |
7. | 15328 2014 Cocofina Highland Spring |
8. | 15328 2015 Lucozade |
9. | 15328 2016 Ribena |
10. | 15328 2017 Classic Cola Red Cola |
|--------------------------------------------------------------------|
11. | 16564 2009 Dove The Body Shop |
12. | 16564 2010 L'Occitane |
13. | 16564 2011 Dove Sensitive |
14. | 16564 2015 Paul Mitchell Aveda |
15. | 16897 2007 L'eau D'issey |
|--------------------------------------------------------------------|
16. | 16897 2010 Versace Eros Dolce & Gabbana Paul Sebastian |
17. | 16897 2011 Ck One Versace Man |
18. | 16897 2015 Jean Paul Gaultier |
19. | 16897 2016 Boss No. 6 |
20. | 16897 2018 Aramis |
|--------------------------------------------------------------------|
21. | 17874 2007 Adidas |
22. | 17874 2011 Airness |
23. | 17874 2013 Reebok |
24. | 17874 2014 Nike Caterpillar |
25. | 17874 2015 Columbia sportswear Asics |
+--------------------------------------------------------------------+
Тип help reshape
и help egen
из командной строки Stata для получения дополнительной информации.
(Снимаю шляпу перед @NickCox за напоминание о том, насколько полезной может быть egen
функция concat()
!)
РЕДАКТИРОВАТЬ:
Самый простой способ добавить запятую для разделения различных продуктов, это изменить код следующим образом:
<b>replace product = product + ", " </b>
bysort code year: generate _j = _n
<b>reshape wide product, i(code year) j(_j)</b>
ds product*
<b>egen products = concat(`r(varlist)')</b>
<b>replace products = substr(products, 1, length(products) - 1)</b>
Идея заключается в том, чтобы добавитьзапятая в конце каждого продукта, а затем после reshape
устраните нежелательную запятую, используя комбинацию функций substr()
и length()
:
list code year products
+-----------------------------------------------------------------------+
| code year products |
|-----------------------------------------------------------------------|
1. | 15328 2007 Coca-Cola, Coca-Cola Diet |
2. | 15328 2008 Pepsi |
3. | 15328 2010 Pepsi Diet, Dr Pepper |
4. | 15328 2011 7 Up |
5. | 15328 2012 Aquafina, Fanta |
|-----------------------------------------------------------------------|
6. | 15328 2013 Amp Energy, Manhattan Special, Jolt Cola, Mountain Dew |
7. | 15328 2014 Cocofina, Highland Spring |
8. | 15328 2015 Lucozade |
9. | 15328 2016 Ribena |
10. | 15328 2017 Classic Cola, Red Cola |
|-----------------------------------------------------------------------|
11. | 16564 2009 Dove, The Body Shop |
12. | 16564 2010 L'Occitane |
13. | 16564 2011 Dove Sensitive |
14. | 16564 2015 Paul Mitchell, Aveda |
15. | 16897 2007 L'eau D'issey |
|-----------------------------------------------------------------------|
16. | 16897 2010 Versace Eros, Dolce & Gabbana, Paul Sebastian |
17. | 16897 2011 Ck One, Versace Man |
18. | 16897 2015 Jean Paul Gaultier |
19. | 16897 2016 Boss No. 6 |
20. | 16897 2018 Aramis |
|-----------------------------------------------------------------------|
21. | 17874 2007 Adidas |
22. | 17874 2011 Airness |
23. | 17874 2013 Reebok |
24. | 17874 2014 Nike, Caterpillar |
25. | 17874 2015 Columbia sportswear, Asics |
+-----------------------------------------------------------------------+