R:如何为Kmeans执行FOR循环

时间:2015-09-16 08:09:30

标签: r

我的输入文件格式如下:

RN KEY  MET1    MET2    MET3    MET4
1   1   0.11    0.41    0.91    0.17
2   1   0.94    0.02    0.17    0.84
3   1   0.56    0.64    0.46    0.7
4   1   0.57    0.23    0.81    0.09
5   2   0.82    0.67    0.39    0.63
6   2   0.99    0.90    0.34    0.84
7   2   0.83    0.01    0.70    0.29

我必须以R -separately为K执行K分支,其中Key = 1且Key = 2,依此类推...... 之后,最终输出CSV应该看起来像

RN  KEY MET1    MET2    MET3    MET4    CLST
1   1   0.11    0.41    0.91    0.17    1
2   1   0.94    0.02    0.17    0.84    1
3   1   0.56    0.64    0.46    0.77    2
4   1   0.57    0.23    0.81    0.09    2
5   2   0.82    0.67    0.39    0.63    1
6   2   0.99    0.90    0.34    0.84    2
7   2   0.83    0.01    0.70    0.29    2

即Key = 1将被视为单独的DF,而Key = 2将被视为单独的DF,依此类推...... 最后,聚类(每个DF)的输出首先与Key列组合(因为Key不能参与聚类),然后与每个不同的DF组合以获得最终输出

In the above example :
DF1 is 
KEY MET1    MET2    MET3    MET4
1   0.11    0.41    0.91    0.17
1   0.94    0.02    0.17    0.84
1   0.56    0.64    0.46    0.77
1   0.57    0.23    0.81    0.09

DF2 is 
KEY MET1    MET2    MET3    MET4
2   0.82    0.67    0.39    0.63
2   0.99    0.90    0.34    0.84
2   0.83    0.01    0.70    0.29

请建议如何在R

中实现
Psuedo code :
n<-Length(unique(Mydf$key))
   for i=1 to n
       {
          #fetch partial df for each value of Key and run K means
             dummydf<-subset(mydf,mydf$key=i
            KmeansIns<-Kmeans(dummydf,2)
          # combine with cluster result
              dummydf<-data.frame(dummydf,KmeansIns$cluster)

      # combine each smalldf into final Global DF
       finaldf<-data.frame(finaldf,dummydf)
        }Next i

  #Now we have finaldf then it can be written to file

3 个答案:

答案 0 :(得分:2)

我认为最简单的方法是使用by

的内容
by(data = DF, INDICES = DF$KEY, FUN = function(x) {
  # your clustering code here
})

其中x是每个DF的{​​{1}}的子集。

答案 1 :(得分:1)

使用data.tables的解决方案。

library(data.table)
setDT(DF)[,CLST:=kmeans(.SD, centers=2)$clust, by=KEY, .SDcols=3:6]
DF
#    RN KEY MET1 MET2 MET3 MET4 CLST
# 1:  1   1 0.11 0.41 0.91 0.17    2
# 2:  2   1 0.94 0.02 0.17 0.84    1
# 3:  3   1 0.56 0.64 0.46 0.70    1
# 4:  4   1 0.57 0.23 0.81 0.09    2
# 5:  5   2 0.82 0.67 0.39 0.63    2
# 6:  6   2 0.99 0.90 0.34 0.84    2
# 7:  7   2 0.83 0.01 0.70 0.29    1

答案 2 :(得分:0)

#Read data
mdf <- read.table("mydat.txt", header=T)

#Convert to list based on KEY column
mls <- split(mdf, f=mdf$KEY)

#Define columns to use in clustering
myv <- paste0("MET", 1:4)

#Cluster each df item in list : modify kmeans() args as appropriate
kls <- lapply(X=mls, FUN=function(x){x$clust <- kmeans(x[, myv],
    centers=2)$cluster ; return(x)})

#Make final "global" df
finaldf <- do.call(rbind, kls)