2016-11-08 23 views
0

単変量データをグループ化する方法をグループごとに見つけようとしています。たとえば、以下のデータでは、2つの障害コード(aとb)と各グループごとに6つのデータポイントがあります。プロットでは、各障害コードに対して、障害時に2つの異なるクラスターが存在することがわかります。手動でこれは悪くないですが、私は大きなデータセット(〜100K行と〜30コード)でこれを行う方法を理解できません。私は最終的な結果が私に各クラスターのメドイドとそのクラスター内のコード数を与えることを望みます。R単変量グループ別クラスタリング

library(ggplot2) 
failure <- rep(c("a","b"),each=6) 
ttf <- c(1,1.5,2,5,5.5,6,8,8.5,9,14,14.5,15) 
data <- data.frame(failure,ttf) 
qplot(failure, ttf) 
results <- data.frame(failure = c("a","b"), m1 = c(1.5,8.5), m2 = c(5.5,14.5)) 

enter image description here

私は私に、以下の表のようなものを与えるために最終的な結果のためにしたいと思います。

failure m1 m1count m2 m2count 
a  1.5 3  5.5 3 
b  8.5 3  14.5 3 
+0

エラーコードあたり2つのクラスタしかありませんか?各障害コードごとにクラスタを作成しますか? 'kmeans()'またはk最近隣の関数をチェックします。キャレット、クラス、FNNライブラリの両方に実装があります。 – emilliman5

+0

助けてくれてありがとうございました。私は、1つの失敗コードにつき2つのクラスタしか存在せず、単純化のためにその仮定の結果に基づいていると仮定します。私はkmeansを見て、私が思いつくことができるものを見ていきます。私が立ち上がっている部分は、グループに基づいてクラスタを実行し、その結果をデータフレームに取り込むことです。 – nathanbeagle

答えて

1

これはあなたが、それはすべての障害グループに適用されますtapplyでそれを変更することができますが、障害グループごとに2つだけのクラスタを想定し、あなたがやりたいだろう。

res2 <- tapply(data$ttf, INDEX = data$failure, function(x) kmeans(x,2))  
res3 <- lapply(names(res2), function(x) data.frame(failure=x, Centers=res2[[x]]$centers, Size=res2[[x]]$size))  
res3 <- do.call(rbind, res3) 

res3 
    failure Centers Size 
1  a  5.5 3 
2  a  1.5 3 
11  b 14.5 3 
21  b  8.5 3 
+0

ですから、開始点を最小、中央値、最大として3つのクラスターを使用することで、プロセスをわずかにより決定論的にしようとしました。だから、私はこれを行うときに "初期センターのより良いセットを試してみよう"というエラーが出ます。 min(x)、中央値(x)、max(x) ' これを上記のソリューションに組み込む方法はありますか? – nathanbeagle

+0

このアプローチでは、クラスタ番号を元のデータに戻すことができますか? – nathanbeagle

+0

それは確かにできます! 'data <-cbind(data、cluster = unlist(lapply(names(res2)、function(x)paste0(x、res2 [[x]] $ cluster)))) 'クラスタ番号の前に障害グループを追加しました。クラスタの番号付けは各障害グループごとに1で再開するため、クラスタを区別するのは簡単です。 – emilliman5

関連する問題