0

我有像var2000,之类的变量var2001var2002这意味着每个变量分别是 year 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

但是,当有很多年时,这种方法太繁琐了。

有没有简单的方法可以做到这一点?

4

2 回答 2

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 |
     +------------------------------------------+
于 2018-11-01T03:27:53.543 回答
2

@Pearly Spencer 合理地专注于您遇到的问题,即如何获取特定变量。我会更进一步,并建议你应该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 |
     +----------------------------------------------------------+
于 2018-11-01T09:04:20.570 回答