Как агрегировать реляционные данные в Stata? - PullRequest
2 голосов
/ 27 мая 2011

Я не могу обернуться вокруг следующей проблемы программирования Stata:

У меня есть таблица с перечнем всех покупок автомобилей покупателями и сделана:

Customer | Make | Price
-----------------------
      c1 |   m1 |     1
      c1 |   m1 |     2
      c1 |   m3 |     1
      c2 |   m2 |     2
      c3 |    . |     .

Я хочу преобразовать это в таблицу с одним наблюдением / строкой на каждого клиента, перечисляя максимальную цену, уплаченную за каждую марку:

Customer | m1 | m2 | m3
-----------------------
      c1 |  2 |  0 |  1
      c2 |  0 |  1 |  0
      c3 |  0 |  0 |  0

Как мне этого добиться? Я знаю reshape wide, но это не работает из-за удвоенной строки c1 | m1. Кроме того, пропущенные значения для c3 вызывают проблемы.

1 Ответ

4 голосов
/ 27 мая 2011

В зависимости от того, что вы хотите сделать, я предлагаю подходить к этому немного по-другому.Например, используя -bysort-, вы можете найти максимальную цену по клиенту для каждой марки.

bysort Customer Make : egen maxPrice = max( Price )

Или вы можете использовать коллапс, чтобы найти максимальную цену по клиенту и сделать:

collapse (max) Price, by( Customer Make )

Но, если вы действительно хотите, чтобы таблица, которую вы разместили с помощью -reshape-, вы могли бы выполнить следующее:

collapse (max) Price, by( Customer Make )
drop if Price == .
reshape wide Price, i( Customer ) j( Make ) string
renpfix Price 

Обратите внимание, что изменение формы завершится неудачей, если оно обнаружит отсутствующие данные в столбце Price.Я отбросил эти наблюдения в приведенном выше коде, но вы можете сделать что-то другое, например заменить отсутствующие данные нулями, как показано в опубликованной целевой таблице.

...