如何在 R 中找到产生最大 colMeans 的簇?

How to find the clusters that produce the maximum colMeans in R?

我有一个像

这样的数据框
  V1 V2 V3
1  1  1  2
2  0  1  0
3  3  0  3
....

并且我有一个与数据框中的行数长度相同的向量(如果重要的话,它是来自 kmeans 的 cluster

[1] 2 2 1...

从那些我可以得到每个集群的colMeans,比如

cm1 <- colMeans(df[fit$cluster==1,])
cm2 <- colMeans(df[fit$cluster==2,])

(我不认为我应该明确地做那部分,但这就是我思考问题的方式。)

我想要的是为数据框的每一列获取 colMeans 最大值的向量的值。我也想做(单独做)第二高,第三等。所以在这个例子中我希望输出是一个向量,数据框的每一列都有一个元素:

1 2 1...

因为对于数据框的第一列,第一个聚类的列均值是 3,而第二个聚类的列均值是 0.5。

如果cluster向量的长度与'df'的行数相同,split数据由'cluster'列变成list,

lst1 <- lapply(split(df, fit$cluster), function(x) stack(colMeans(x)))
dat <- do.call(rbind, Map(cbind, cluster = names(lst1), lst1)) 
aggregate(values ~ ind, dat, FUN = which.max)

如果我们需要根据列均值对多个元素进行子集化,在数据中创建 'cluster' 列,重塑为 'long' 格式(或使用 summarise/across),按 'cluster'、'name'、获取 'value' 的 meanarrange 列 'name' 和 desc 中的 'value'结束顺序,然后 return nslice_head

library(dplyr)
library(tidyr)
df %>% 
   mutate(cluster = fit$cluster) %>% 
   pivot_longer(cols = -cluster) %>%
   group_by(cluster, name) %>%
   summarise(value = mean(value), .groups = 'drop') %>% 
   arrange(name, desc(value)) %>% 
   group_by(name) %>%
   slice_head(n = 2)

数据

df <- structure(list(V1 = c(1L, 0L, 3L), V2 = c(1L, 1L, 0L), V3 = c(2L, 
0L, 3L)), class = "data.frame", row.names = c("1", "2", "3"))

fit <- structure(list(cluster = c(2, 2, 1)), class = "data.frame", 
  row.names = c(NA, 
-3L))