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
徐々に改善していけたらなと考えてます。
もっと修練しないとなー。