**K-means clustering is quick and dirty and generally provides some interesting results. However, the default kmeans function in R lacks features, such as actually storing the model to use the centroids for prediction purposes on unseen data. That’s where flexclust comes in.**

Flexclust is a package that is designed around K-centroid cluster analysis. Its most important function is the acronym *kcca()*.

**kcca()**

The main function kcca implements a general framework for k-centroids cluster analysis supporting arbitrary distance measures and centroid computation.

First, let’s load the packages.

```
library(flexclust)
library(dummies)
```

Let’s say you have a data frame (dt) that contains numeric data and factors. You’re gonna want to convert all factors to binaries.

`dt <- dummy.data.frame(dt, dummy.classes='factor')`

Next, we convert the data frame to a matrix. There are multiple ways to do this, however, to make sure that all variables are treated as equally important, I scale and center the data (and so should you).

```
mx <- data.matrix(dt)
mx_scaled <- scale(mx)
```

Finally, I train the model and store it in a kModel variable.

`kModel <- kcca(mx_scaled, 5, family = kccaFamily('kmeans'))`

Now, we need to scale the new data with the same parameters as the old data. You should know that the *scale()* function returns a matrix, but it has two attributes that you can use: *scaled:center* and *scaled:scale*. You can use these as parameters to scale your new data.

```
mx2 <- data.matrix(dt2)
mx2_scaled <- scale(mx2, attr(mx_scaled, "scaled:center"), attr(mx_scaled, "scaled:scale"))
```

Finally, you can use the *predict()* function to use the centroids from your first data set to cluster your new data.

`predict(kModel,mx2_scaled)`

Great succes!

### Say thanks, ask questions or give feedback

**Technologies get updated, syntax changes and honestly… I make mistakes too. If something is incorrect, incomplete or doesn’t work, let me know in the comments below and help thousands of visitors.**