ここにいくつかのデータがあります。
df <- data.frame(groupvar=rep(c('a','b'),100),v1=rnorm(200),v2=rnorm(200))
ここで、各グループ内で k 平均を実行します。
require(dplyr)
kobjs = df %>% group_by(groupvar) %>%
do(kclust = kmeans(cbind(.$v1,.$v2),centers=5))
「kobjs」は次のようになります。
groupvar kclust
(fctr) (chr)
1 a <S3:kmeans>
2 b <S3:kmeans>
クラスターの割り当て (および、理想的には中心点) を取得して、元のデータ フレームに追加したいと思います。これを行うにはほうきを使用できると思いました:
require(broom)
merged = kobjs %>%
group_by(groupvar) %>% do(augment(.$kclust[[1]],df))
しかし、それはどういうわけか、200X4 ではなく 400X4 マトリックスを生成します。どうしてこうなりました?必要な動作を取得するにはどうすればよいですか?
EDIT1: aosmith からの洞察により、私が望んでいた方法で解決しました。おそらくよりエレガントにする方法があります (left_join は必要ですか?) が、それは私が望む動作です:
kobjs = df %>%
do(kmeans(cbind(.$v1,.$v2),centers=5) %>%
fitted(method="centers") %>%
data.frame(cluster=rownames(.),entry=1:length(.),row.names=NULL)) %>%
left_join(df %>% group_by(groupvar) %>% mutate(entry=1:n()),
by=c("entry","groupvar"))