2016-11-08 88 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