我正在使用Stata SE 13并且有一个看起来像这样的数据集(我知道这是一个代码块,但我用它来进行格式化):
Obs var1 var2 masterID id1 id2 id3 id4 . . . idN
1 a b 123 123 123 123 123 . . . 123
2 c d 456 456 456 789 897 . . . 897
有时,id变量在观察中发生变化,每次发生这种情况时,我想创建另一个观察,包括所有其他变量,并使所有其他id变为空白。观察1是完美的,但像2这样的观察是个问题。从上表中,所需的输出是:
Obs var1 var2 masterId id1 id2 id3 id4 . . . idN
1 a b 123 123 123 123 123 . . . 123
2 c d 456 456 456 . . . . . .
3 c d 789 . . 789 . . . . .
4 c d 897 . . . 897 . . . 897
我试图使用类似的东西:
forvalues i = 1(1)N {
local k = `i'+1
expand 2 if id`i' != id`k', generate(mark`i')
forvalues w= `k'(1)2014 {
replace id`w' = "" if mark`i' == 1
replace masterId = id`i' if mark`i' == 1
}
}
* Repeat for forward values
* Some deleting of blank observations and original observations also
如果id改变一次,这种方法很有效,但是对于任何改变倍数的事情都存在很大问题(使数据混乱)。
任何建议都将不胜感激!谢谢。
答案 0 :(得分:2)
当数据采用长格式时,这样的问题通常会更容易。这就是我采取的方法:
clear
input str1(var1 var2) masterID id1 id2 id3 id4 id5
"a" "b" 123 123 123 123 123 123
"c" "d" 456 456 456 789 897 897
end
reshape long id, i(masterID) j(i)
replace masterID = id if masterID!=id
reshape wide id, i(masterID) j(i)
order var1 var2 masterID