跨变量发生的更改数量

时间:2018-11-01 03:07:44

标签: stata

我有变量var2000var2001var2002,这意味着每个变量分别是年份200020012002的变量。

我想计算一下它们从上一年更改为下一年的次数。

所以我的目的是像这样构造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 :(得分:2)

以下对我有用:

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 |
     +------------------------------------------+

答案 1 :(得分:2)

@Pearly Spencer合理地专注于您所遇到的问题,即如何获取特定变量。我会进一步建议您reshape long而不是reshape回来。您的数据看起来像面板数据或纵向数据,最好保留long。您的问题具有特征性:即使是简单的问题,对于长数据而言,通常也要求布局(结构,格式)宽泛的笨拙答案。除此之外,主要是有人编写了egen函数来按行执行某些操作。有关更长时间的讨论,请参见this paper

我剩下的答案显示了两种通过循环从现有布局中获取所需内容的方法。对于您的真实数据,有很多变量,不必键入变量的所有名称:还有其他方法可以做到,但是如何做到最好取决于您的真实姓名,您不必告诉我们。

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 |
     +----------------------------------------------------------+