読者です 読者をやめる 読者になる 読者になる

廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

AWK で gather と spread

はじめに

dplyr ユーザーのための AWK 入門 - 廿TT に引き続き、相模原市オープンデータライブラリー | 相模原市 で公開されている駅別乗降人員の推移データを使用して AWK で簡単なデータ整形を行ってみます。

列持ちのデータを行持ちに変える

wide フォーマットのデータを long フォーマットに変えたい(tidyr でいう gather みたいなことがしたい)とき。

BEGIN{print "路線名,駅名,年,人数"}
NR==1{
	for(i=3;i<=NF;i++) year[i]=substr($i,1,4)
}
NR>1{
	for(i=3;i<=NF;i++) print($1 "," $2 "," year[i] "," $i)
}

アウトプットはこんな感じになる。

路線名,駅名,年,人数
横浜線,橋本駅,1975,31954
横浜線,橋本駅,1980,35144
...

行持ちのデータを列持ちに変える

long フォーマットのデータを wide フォーマットに変えたい(tidyr でいう spread みたいなことがしたい)とき。

これはあんまりシンプルに書けなかった。

NR==1{
	colname = $1","$2
}
NR > 1{
	if(prev==""){a=$1 "," $2 "," $4;year=$3}
	if(prev==$1","$2){a= a "," $4;year=year "," $3};
	if(prev!="" && prev!=$1","$2){a = a "\n" $1 "," $2 "," $4;year=$3};
prev = $1","$2
}
END{
	printf(colname ",");
	printf (year "\n");
	printf(a "\n")
}

アウトプットはこんな感じになる。

路線名,駅名,1975,1980,1985,1989,1993,1998,2003,2008,2009,2010,2011,2012,2013
横浜線,橋本駅,31954,35144,44758,57466,88988,94680,104522,118162,118098,120244,120482,122254,125510
横浜線,相模原駅,29144,31732,39784,48172,52430,52812,53448,56370,55774,56158,55716,56566,57552
...