我有变量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
但是,当有很多年的时候,这种方法太繁琐了。
有没有简单的捷径可以做到这一点?
答案 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 |
+----------------------------------------------------------+