2016-11-08 150 views
0

我正在嘗試查找按羣組羣集單變量數據的方法。例如,在下面的數據中,每個分組有兩個失敗代碼(a和b)和6個數據點。在圖中可以看到,對於每個故障代碼,故障時間有2個不同的集羣。手動這並不壞,但我無法弄清楚如何用更大的數據集(約100K行和約30個代碼)完成此操作。我希望最終的結果能夠爲每個集羣提供medoid和該集羣中的代碼數量。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

感謝您的幫助,我會假設每個失敗代碼只有2個集羣,並且爲了簡單起見,將結果基於該假設。我會研究kmeans,看看我能想出什麼。我被絆倒的部分是基於組執行羣集,然後將結果輸入到數據幀中。 – nathanbeagle

回答

1

這是會做你想要什麼,假設每個失敗組只有兩個集羣,儘管你可以在tapply更改它適用於所有故障組。

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個簇,以起始點作爲最小值,中值和最大值來使過程稍微更確定。所以,而不是在tapply中使用: 'min(x),median(x),max(x)' 但是當我這樣做時,我得到一個錯誤「嘗試更好的一組初始中心」。會不會有一種方法將其納入上述解決方案? – nathanbeagle

+0

這種方法能否將羣集編號追加回原始數據? – nathanbeagle

+0

它當然可以! 'data <-cbind(data,cluster = unlist(lapply(names(res2),function(x)paste0(x,res2 [[x]] $ cluster))))''我把故障組預設爲簇號可以很容易地區分集羣,因爲每個故障組的集羣編號從1重新開始。 – emilliman5