Rでdata.frame間の距離を測ってmatrixにする
昨日の続き。昨日は、vectorのユークリッド距離を直接計算してたけど、data.frameの各行ごとの距離を測ろうとするとそういうワケにはいかんし。どうすんべ?と思っていたら、dist()という関数があった。何度か、「やっぱりObjective-Cで書いてみようか、C#で書いてみようか、perlで書いてみようか」と思ったけど、その辺の言語だとこういう行列計算が面倒なので、やっぱりRで。
というワケで、昨日のをちょっと直して、関数にしてみる。
myFunc <- function(df){ len<-nrow(df) # 行数 s <- matrix(NA,len,len) for(i in 1:len){ for(j in 1:len){ d <- dist(rbind(df[j,],df[i,]),method="euclidean") # distで距離を計算 s[i,j]<- -1*d^2 } } # 自分自身の距離を測っても0になるに決まっているので、自分以外の各要素との距離のmedianを代入しとく m<-median(s[,1]) for( i in 2:len){ s[i,i] <- m } s }
ちなみに、やりたいことはもちろんここで終わりじゃない。
ところで、function()で指定している引数(df)が、data.frameかvectorか?を判別する方法はあるだろうか?nrow(df)が1になった時は、vectorと判断して、各要素間でdist()するようにして、nrow(df)が1でない時は、各行をrbindしてdist()するようにする、、、とか、そういう方針で良いのかな?と思いつつ、そういうif文をRではどうやって書くのだろう?のレベルで悩む、、、、。