Как мне получить сумму Var_c через Var_a и Var_b? - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь найти сумму по двум переменным.

Если у меня есть следующие данные:

Name   Commodity        Amount_cmdt

Alex       apple           5
Ben        orange          10
Chris      apple           25
Alex       orange          10
Alex       apple           10
Chris      orange          10
Ben        apple            5  

Я хочу, чтобы окончательный набор данных выглядел так:

Name   Commodity      Amount_cmdt       total_apple    total_orange

Alex       apple           5                   15              10
Ben        orange          10                  5               10
Chris      apple           25                  25              20
Alex       orange          10                  15              10
Alex       apple           10                  15              10
Chris      orange          10                  25              20
Ben        apple            5                   5              10 
Chris      orange          10                  25              20   

В конечном итоге, когда у меня будет количество яблок и апельсинов, которое есть у каждого человека, я могу отбросить дубликаты.Но как мне сформулировать утверждение:

если name = Chris и Commodity = orange, то total_orange = sum (Amount_cmdt)?

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

foreach var of varlist Name {
    foreach var of varlist Commodity {
        replace total_apple = sum( Amount_cmdt) if Commodity == "apple"
        replace total_orange = sum( Amount_cmdt) if Commodity == "orange"
    }
}

list

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

@ Перли Спенсер дал вам то, что вы просили, но подробный код показывает, что это очень искаженная структура данных - с которой, я предполагаю, работать будет очень неловко.

Кроме того, вам не нужно повторять вычисления, а затем отбрасывать дубликаты, поскольку вы можете напрямую получить простые структуры.

Обратите внимание, что это уничтожает исходный набор данных, поэтому сохранение этого оригинала всегда будет хорошей идеей.Кроме того, мы не можем комментировать, какие у вас могут быть другие переменные.

Один или оба из этих макетов, вероятно, будут как или более полезными.

clear

input str6 (name commodity) amount 
Alex       apple           5      
Ben        orange          10     
Chris      apple           25     
Alex       orange          10     
Alex       apple           10     
Chris      orange          10     
Ben        apple            5     
Chris      orange          10     
end

collapse (sum) amount, by(name commodity) 

list, sepby(name) 

     +---------------------------+
     |  name   commod~y   amount |
     |---------------------------|
  1. |  Alex      apple       15 |
  2. |  Alex     orange       10 |
     |---------------------------|
  3. |   Ben      apple        5 |
  4. |   Ben     orange       10 |
     |---------------------------|
  5. | Chris      apple       25 |
  6. | Chris     orange       20 |
     +---------------------------+

reshape wide amount, i(name) j(commodity) string 

list 

     +-----------------------------+
     |  name   amoun~le   amoun~ge |
     |-----------------------------|
  1. |  Alex         15         10 |
  2. |   Ben          5         10 |
  3. | Chris         25         20 |
     +-----------------------------+
0 голосов
/ 12 октября 2018

Пример использования вашей игрушки:

clear

input strL(name commodity) amount total_apple total_orange
Alex       apple           5                   15              10
Ben        orange          10                  5               10
Chris      apple           25                  25              20
Alex       orange          10                  15              10
Alex       apple           10                  15              10
Chris      orange          10                  25              20
Ben        apple            5                   5              10 
Chris      orange          10                  25              20 
end

У меня работает следующее:

bysort name commodity: egen totals = total(amount)
bysort name (commodity): generate totalapple = totals[1]
bysort name (commodity): generate totalorange = totals[_N]

list name commodity amount total_apple totalapple total_orange totalorange, abbreviate(15)

     +------------------------------------------------------------------------------------+
     |  name   commodity   amount   total_apple   totalapple   total_orange   totalorange |
     |------------------------------------------------------------------------------------|
  1. |  Alex       apple        5            15           15             10            10 |
  2. |  Alex       apple       10            15           15             10            10 |
  3. |  Alex      orange       10            15           15             10            10 |
  4. |   Ben       apple        5             5            5             10            10 |
  5. |   Ben      orange       10             5            5             10            10 |
     |------------------------------------------------------------------------------------|
  6. | Chris       apple       25            25           25             20            20 |
  7. | Chris      orange       10            25           25             20            20 |
  8. | Chris      orange       10            25           25             20            20 |
     +------------------------------------------------------------------------------------+

РЕДАКТИРОВАТЬ:

Выможно обобщить это для более чем двух товаров следующим образом:

clear

input strL(name commodity) amount 
Alex       apple           5     
Ben        orange          10                 
Chris      apricot         3
Alex       apricot         4
Ben        apricot         2
Chris      apple           25         
Alex       orange          10              
Alex       apple           10         
Chris      orange          10          
Ben        apple            5             
Chris      apricot         15
Alex       apricot         6
Chris      orange          10                
end

bysort name commodity: egen totals = total(amount)
egen commodities = group(commodity)

levelsof commodity, local(allcommodities) clean
local i 0

foreach var of local allcommodities {
    local ++i
    generate `var' = .
    bysort name (commodity): replace `var' = totals if commodities == `i'
    bysort name (commodity): egen total`var' = min(`var')
    drop `var'
}

drop commodities

Модифицированный фрагмент кода выдаст желаемый результат:

list name commodity amount total*, abbreviate(15)

     +-------------------------------------------------------------------------------+
     |  name   commodity   amount   totals   totalapple   totalapricot   totalorange |
     |-------------------------------------------------------------------------------|
  1. |  Alex       apple        5       15           15             10            10 |
  2. |  Alex       apple       10       15           15             10            10 |
  3. |  Alex     apricot        6       10           15             10            10 |
  4. |  Alex     apricot        4       10           15             10            10 |
  5. |  Alex      orange       10       10           15             10            10 |
     |-------------------------------------------------------------------------------|
  6. |   Ben       apple        5        5            5              2            10 |
  7. |   Ben     apricot        2        2            5              2            10 |
  8. |   Ben      orange       10       10            5              2            10 |
  9. | Chris       apple       25       25           25             18            20 |
 10. | Chris     apricot        3       18           25             18            20 |
     |-------------------------------------------------------------------------------|
 11. | Chris     apricot       15       18           25             18            20 |
 12. | Chris      orange       10       20           25             18            20 |
 13. | Chris      orange       10       20           25             18            20 |
     +-------------------------------------------------------------------------------+
...