このブログでは、統計解析ソフトStataのプログラミングのTipsや便利コマンドを紹介しています.
Facebook groupでは、ちょっとした疑問や気づいたことなどを共有して貰うフォーラムになっています. ブログと合わせて個人の学習に役立てて貰えれば幸いです.
今日もデータを整える際のTipsについてまとめてみました.
今回ご紹介するのは、エクセルなどのデータをStataでインポートしたあとに、1行目のデータをすべて変数名に変換したいときの方法です.
もちろん、データをインポートするときに、firstrowというオプションを入れれば1行目を変数名にかえることができるのですが、先日経験した事例で、今回ご紹介するような方法も知っておいた方が良いかなと思って記事にしてみました.
どんな事例だったかと言いますと、1つのエクセルファイルにデータをすべて入れる際に、いくつかのシートに分割して入れてもらっていたのですが、2枚目以降のデータセットが、1行目に変数名が入っていない!という事態が発生しました.
複数のシートが入ったエクセルファイルのインポートをプログラムする方法は、以前の記事にありますが、今回は最初に1行目の値を変数名にしないことにしてインポートします.(同じデータを利用しています)
import excel "filename.xlsx", describe
return list
clear
forvalues i=1/`r(N_worksheet)' {
import excel using "filename.xlsx", sheet(`r(worksheet_`i')') cellrange(`
r(range_i')')
generate id =r(worksheet_`i')
save file_`i'.dta, replace
clear
}
以前の記事とよ~く比較しないと分からないと思いますが、import excelのところでfirstrowのオプションが消えているのがわかりますかね?
以前の記事で紹介したプログラムを再掲しますが、最初にworking directoryをしています.ここでもfirstrowを消していますが、これで最終的にはデータセットが1つにまとまります.
global wd "C:\User\...\" /* working directory名 */
import excel "${wd}filename.xlsx", describe
return list
clear
forvalues i=1/`r(N_worksheet)' {
import excel using "${wd}filename.xlsx", sheet(`r(worksheet_`i')') cellrange(`r(range_`i')')
gen id =r(worksheet_`i')
save ${wd}tempfile_`i'.dta, replace /* 中間データとしていったん保存 */
clear
}
use ${wd}tempfile_1.dta, clear
forvalues i = 2/`r(N_worksheet)' {
append using ${wd}tempfile_`i'
/* 順番に結合してきます */
}
save ${wd}file, replace
!del ${wd}temp* /* temp という名前を頭につけておいたものをすべて消去 */
そこで、最終的には1行目のデータを変数名に置き換える必要がでてきます.以下のプログラムをコピペしていただくだけでできてしまうのです.
unab varlist : *
foreach v of local varlist {
local value = `v'[1]
local vname = strtoname(`"`value'"')
rename `v' `vname'
label var `vname' `"`value'"'
}
drop in 1
この時に使う、unabというコマンドですが、指定する変数群をvarlistというローカルマクロに格納します. このとき、ワイルドカードの*(アスタリスク)をコロンのあとにおいているので、すべての変数という意味になります.
これを、複数の変数を含んだローカルマクロでループを組んでいます.これについては以前の記事で様々なループの組み方を説明していますのでそちらを参照してください.
そして、一番上の変数の値をとってきて”value”というローカルマクロに格納します.
次に”strtoname”という関数がありますが、これは変数名として適切な形に整えてくれます.
strtoname()とやると、32バイトにtruncateされた名前にしてくれます.Stataの中で名前として不適切な場合にはアンダーバーを入れてつないでくれます.また、数字が先頭に来ている場合などはpのところに0以外の数字(1でよいですが)を入れると、アンダーバーを先行させて変数名として適切に処理できるようにしてくれます.以下のような例がhelpに載っていました.
strtoname(s[,p])
strtoname("name") = "name"
strtoname("a name") = "a_name"
strtoname("5",1) = "_5"
strtoname("5:30",1) = "_5_30"
strtoname("5",0) = "5"
strtoname("5:30",0) = "5_30"
そして名前を変更し、ラベルは同じ名前のラベルを付けて、最後は1行目を消去します.
こうすることで変数名が抜けたデータシートも怖がらずに処理できるようになりますね.
ぜひお試しあれ!
関連記事として、こちらも一読ください.
コメント