Stata: 計算分組個數

網友王雅琪AmandaStata教學文章索引的留言中問了這個問題:

請問我要如何用指令將下表
id level
1 A
1 A
1 B
2 A
2 B
3 B

轉換成
id level #ofA #ofB
1 A 2 1
1 A 2 1
1 B 2 1
2 A 1 1
2 B 1 1
3 B 0 1

這問題如果level只有兩組,其實不難作,繞個彎就能解出來了。

use "http://images.researcher20.com/stata_group/stata_group.dta", clear
egen acount = group(level)
gsort +id +acount
by id: egen acount2 = count(acount) if acount==1
bys id: replace acount2 = acount2[_n-1] if acount2==.
replace acount2=0 if acount2==.
bys id: egen bcount2 = count(acount) if acount==2
gsort +id -level
by id: replace bcount2 = bcount2[_n-1] if bcount2==.
replace bcount2=0 if bcount2==.

首先,是使用資料庫 (那行use是在同一行)。

之後,因為level本來是string,轉換成integer才可以計數。這裡用到的方法是前文Stata: 產生分組序號所介紹的。

接下來就是排序了。先照id排,然後照分組後的數字排。

要計數怎麼作呢?我先計算每個人有幾個1 (也就是level裡的A)。但是這樣子的話,如果level是B,那就沒計數計到了。所以下一行將B那行的空白,填入前一個數字 (這也就是為什麼之前要排序)。

如果完全沒有A,只有B,那計數的時候就會填上.,下一行就取代成為0。

算B的時候,道理也是一樣的,唯一不同的就是排序作了變換。

你可能會問:那level有3組以上怎麼辦呢?確實,上面的方法僅適用於level只有兩組,要三組以上就要寫不同的code了。目前還沒想到一個絕佳解決辦法。

歡迎高手交流!

標籤: