データとエンジニアリングのよもやま話

データ活用が推進できるためのエンジニアリングに関するブログの筈..

No.22 R programming -Making original function-

ちょっとした話題と個人的興味からRで、独自関数を作成してみました。
大した関数ではないのですが、恥を公開する意味で書いていきたいと思います。(笑)

ところで、Rでの独自関数の書き方ですが、こんな感じに定義します。

power2 <- function(x) x^2

上記は、関数本体がシンプルな1行な場合ですね。
勿論、returnを利用して、

power2 <- function(x) {
	return (x^2)
}

と書くこともできます。個人的には、1行処理でも後者のほうが好きかな..

戻り値が複数の場合もいけるそうです!ここら辺は、Pythonとかと同じですかね?!

mypower2 <- function(x) {
   y <- x^2
   return( list(x, y) ) 
}

さて、関数の書き方は、このあたりにしておいて、今回、関数化した内容はこれです。

・あるデータセット(教師無し)とクラスタ数を引数として渡して、クラスタリング(k-means法)を行い、
 各クラスタの重心から最も近いデータを上位5位まで取得する。(一先ず、上位5位は固定)

この内容であれば、kmeans関数を呼び出して、各クラスタの重心から各データの距離を求めて、、
といった具合に、関数化するまでもない処理かもしれませんが、多少ステップが要りそうでしたので、とりあえず作ってみました~★

で、今回作った関数はこんな感じです。

作ってみて、何か微妙かな~と思いつつ、まぁー、今後、改善していけば良いかな、と。。(笑)
Rでのプログラミングは、関数作成と意味では初に近かったので、正直、戻り値で悩んでみたり、、
# for文は、出来れば使いたくないのですが..

ちなみに、irisデータを利用して、上記関数を呼び出すと、以下のような結果が返ってきます。
clsが属するクラスタ、distが属するクラスタの重心からの距離(ユークリッド距離)を指します。

  Sepal.Length Sepal.Width Petal.Length Petal.Width cls dist
 1   5.0  3.4   1.5   0.2   1   0.06618157
 2   5.1  3.4   1.5   0.2   1   0.11480418
 3   5.1  3.5   1.4   0.2   1   0.14135063
 4   5.1  3.5   1.4   0.3   1   0.14415270
 5   5.0  3.3   1.4   0.2   1   0.14959947
 6   6.0  2.9   4.5   1.5   2   0.21993519
 7   5.7  2.8   4.5   1.3   2   0.26937898
 8   5.9  3.0   4.2   1.5   2   0.32426175
 9   5.7  2.9   4.2   1.3   2   0.34498790
 10   6.2  2.9   4.3   1.3   2   0.37241653
 11   6.8  3.0   5.5   2.1   3   0.25958095
 12   6.9  3.2   5.7   2.3   3   0.26952816
 13   6.7  3.3   5.7   2.1   3   0.27627819
 14   7.1  3.0   5.9   2.1   3   0.30610139
 15   6.8  3.2   5.9   2.3   3   0.30952112

徐々に改善していけたらなと考えてます。
もっと修練しないとなー。