Количество изменений произошло по переменным - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть переменные типа var2000, var2001, var2002, означающие, что каждая из них является переменной для года 2000, 2001, 2002 соответственно.

Я хочу посчитать, сколько раз они менялись с предыдущего года на следующий.

Итак, моя цель - построить Num_change так:

var2000 var2001 var2002 Num_change
   3      2       1        2
   4      4       4        0
   1      0       0        1
   1      0       1        2

Я попробовал следующее:

replace Num_change=2 if var2000~=var2001 & var2001~=var2002

Однако этот метод слишком утомителен, когда много лет.

Есть ли простой короткий способ сделать это?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

@ Перли Спенсер разумно сосредоточилась на вопросе о том, как получить конкретную переменную. Я бы пошел дальше и предложил бы вам reshape long, а не reshape назад. Ваши данные выглядят как панельные или продольные данные и лучше оставить их long. Ваша проблема характерна: даже простые вопросы часто требуют неуклюжих ответов с широкой структурой (структурой, форматом) для длинных данных. Есть исключения из этого, главным образом, что кто-то написал функцию egen, чтобы сделать что-то по строкам. Более подробное обсуждение см. в этом документе .

В оставшейся части моего ответа показаны два способа получить то, что вы хотите, от существующего макета с помощью циклов. Для ваших реальных данных со многими переменными не обязательно будет вводить все имена переменных: будут другие способы сделать это, но как лучше всего это сделать, зависит от ваших реальных имен, которые вы не делаете Расскажи нам.

clear 
input var2000 var2001 var2002 Num_change
   3      2       1        2
   4      4       4        0
   1      0       0        1
   1      0       1        2
 end 

 * 1 
 local vars var2000 var2001 var2002 
 gettoken first vars : vars 
 gen wanted = 0 

 quietly while "`vars'" != "" { 
    gettoken next vars : vars
    replace wanted = wanted + (`next' != `first') 
    local first `next' 
} 

* 2 
local vars var2000 var2001 var2002 
gen WANTED = 0 
tokenize `vars' 
local nvars : word count `vars' 

quietly forval j = 2/`nvars' { 
    local i = `j' - 1 
    replace WANTED = WANTED + (``j'' !=  ``i'') 
}

list 

     +----------------------------------------------------------+
     | var2000   var2001   var2002   Num_ch~e   wanted   WANTED |
     |----------------------------------------------------------|
  1. |       3         2         1          2        2        2 |
  2. |       4         4         4          0        0        0 |
  3. |       1         0         0          1        1        1 |
  4. |       1         0         1          2        2        2 |
     +----------------------------------------------------------+
0 голосов
/ 01 ноября 2018

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

clear

input var2000 var2001 var2002 
   3      2       1       
   4      4       4       
   1      0       0       
   1      0       1       
end

generate id = _n
reshape long var, i(id)

bysort id (_j): generate tag = var != var[_n-1]
reshape wide var tag, i(id)

egen Num_change = rowtotal(tag*)
replace Num_change = Num_change - 1
drop id tag*

list, abbreviate(10)

     +------------------------------------------+
     | var2000   var2001   var2002   Num_change |
     |------------------------------------------|
  1. |       3         2         1            2 |
  2. |       4         4         4            0 |
  3. |       1         0         0            1 |
  4. |       1         0         1            2 |
     +------------------------------------------+
...