【R】0を省いてz-score化

データ解析において標準化は重要です。
よく使われるものとして「平均0、標準偏差が1になるよう変換する」という手法があります。
これは「z-score」とも呼ばれます。
Rではscale関数によって簡単にz-score化できるのですが、データによっては「0は検出されなかったものとして省きたい」場合もあると思います。

そのような場合は0をNAに変換した上でscale関数を実行すれば0を省いて標準化してくれます。

value <- c(rep(0, 5), 1:5)
scale(value)
# [,1]
# [1,] -0.7893522
# [2,] -0.7893522
# [3,] -0.7893522
# [4,] -0.7893522
# [5,] -0.7893522
# [6,] -0.2631174
# [7,]  0.2631174
# [8,]  0.7893522
# [9,]  1.3155870
# [10,]  1.8418218
# attr(,"scaled:center")
# [1] 1.5
# attr(,"scaled:scale")
# [1] 1.900292


#0をNAに
value[value == 0] <- NA
scale(value)
# [,1]
# [1,]         NA
# [2,]         NA
# [3,]         NA
# [4,]         NA
# [5,]         NA
# [6,] -1.2649111
# [7,] -0.6324555
# [8,]  0.0000000
# [9,]  0.6324555
# [10,]  1.2649111
# attr(,"scaled:center")
# [1] 3
# attr(,"scaled:scale")
# [1] 1.581139


#1:5でscaleするときと同様の結果であることを確認
scale(1:5)
# [,1]
# [1,] -1.2649111
# [2,] -0.6324555
# [3,]  0.0000000
# [4,]  0.6324555
# [5,]  1.2649111
# attr(,"scaled:center")
# [1] 3
# attr(,"scaled:scale")
# [1] 1.581139


わりと時間かけてこの方法見つけたのですが、思いっきりドキュメントに書いてあった。。。
f:id:aiuchi0703:20181001182737p:plain