0

ここにいくつかのデータがあります。

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"))
4

1 に答える 1