Несколько вариантов выбора в наборе данных выбора

#stata

#stata

Вопрос:

Исходные данные содержат информацию о consumerid и о cars них purchased .

 clear
    input consumerid car    purchase
    6   American    1
    6   Japanese    0
    6   European    0
    7   American    0
    7   Japanese    0
    7   European    1
    7   Korean      1
end
 

Поскольку это данные о покупке, набор данных необходимо расширять таким образом, чтобы каждый раз, когда потребитель совершает покупку, отображался полный набор автомобилей. Окончательный набор данных должен выглядеть следующим образом (скриншот взят из руководства Stata www.stata.com/manuals/cm.pdf на стр. 97 в разделе «Пример 4: несколько вариантов для каждого случая»):

введите описание изображения здесь

Я сгенерировал несколько кодов (показанных ниже), чтобы почти добраться туда, куда мне нужно, но у меня возникли проблемы с генерацией одного значения purchase = 1 для каждой комбинации consumerid-carnumber (т. Е. Из-за расширения значения покупки дублируются).).

 egen sumpurchase=total(purchase), by(id)
expand sumpurchase
bysort id car (purchase): gen carnumber=_n


    
 

Ответ №1:

Вы могли бы использовать reshape для получения всех комбинаций идентификатора потребителя / автомобиля для каждого купленного автомобиля. В этом примере предполагается, что порядок сортировки в исходном наборе данных определяет, какой car является номером 1, номером 2 и т. Д.

 * Example generated by -dataex-. To install: ssc install dataex
clear
input byte consumerid str8 car byte purchase
6 "American" 1
6 "Japanese" 0
6 "European" 0
7 "American" 0
7 "Japanese" 0
7 "European" 1
7 "Korean"   1
end

// Generate carnumber
bys consumerid: gen carnumber = cond(purchase != 0, sum(purchase), 0)

// To wide
reshape wide purchase, i(consumerid car) j(carnumber)

// Keep purchased cars only
drop purchase0

// Back to long
reshape long

// Drop if no cars purchased for consumerid/carnumber
bysort consumerid carnumber (purchase) : drop if missing(purchase[1])

// Replace missing with 0 for non-purchased cars
mvencode purchase, mv(0)

// Sort and see results
sort consumerid carnumber car
list, sepby(consumerid carnumber) abbr(14)
 

Результаты:

 . list, sepby(consumerid carnumber) abbr(14)

      ---------------------------------------------- 
     | consumerid        car   carnumber   purchase |
     |----------------------------------------------|
  1. |          6   American           1          1 |
  2. |          6   European           1          0 |
  3. |          6   Japanese           1          0 |
     |----------------------------------------------|
  4. |          7   American           1          0 |
  5. |          7   European           1          1 |
  6. |          7   Japanese           1          0 |
  7. |          7     Korean           1          0 |
     |----------------------------------------------|
  8. |          7   American           2          0 |
  9. |          7   European           2          0 |
 10. |          7   Japanese           2          0 |
 11. |          7     Korean           2          1 |
      ---------------------------------------------- 
 

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

1. Это фантастический код, я только что воссоздал его. Спасибо, Ваутер.