網友王雅琪Amanda在Stata教學文章索引的留言中問了這個問題:
請問我要如何用指令將下表
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了。目前還沒想到一個絕佳解決辦法。
歡迎高手交流!
我知道了!!!!!!!!!!!!
在level有三組以上的話
用以下指令
版主您也可以試看看
foreach i in A B C D E F G H I J K L N P Q R S T U V W X Y Z {
bys id: egen nof`i'=sum(level=="`i'")
}
我發現真的可以耶!!!!!!