【问题标题】:How to summarise pam clustering results in R?如何在 R 中总结 pam 聚类结果?
【发布时间】:2020-05-09 09:54:09
【问题描述】:

如果我尝试运行下面的代码来获取我的聚类结果的摘要,我会收到以下错误:

Error in UseMethod("mutate_") : no applicable method for 'mutate_' applied to an object of class "table"

如果 dat_ 是数据框,则此代码有效,但如果是表,则会收到上述错误消息。有没有人有办法解决吗?

    pam_fit <- pam(gower_dist, diss = TRUE, k)  # performs cluster analysis
    pam_results <- dat %>%
      mutate(cluster = pam_fit$clustering) %>%
      group_by(cluster) %>%
      do(the_summary = summary(.))
    pam_results$the_summary

样本数据集:

set.seed(1)
dat <- data.frame(ID = rep(sample(c("a","b","c","d","e","f","g"),10,replace = TRUE),70),
                 disease = sample(c("flu","headache","pain","inflammation","depression","infection","chest pain"),100,replace = TRUE))

dat <- unique(dat)

dat2 <- table(dat)
dat3 <- as.data.frame(dat)

【问题讨论】:

  • 当然,您可以使用as.data.frame(dat),但请确保您在此传输过程中没有丢失任何内容,尤其是列名。
  • 不幸的是,这给出了另一个错误:mutate_impl(.data, dots) 中的错误:列 cluster 的长度必须为 707851(行数)或一个,而不是 1783
  • 来自herelength(pam_fit$clustering)=nrow(college_clean)。因此,请确保 nrow(dat) 等于 length(pam_fit$clustering)
  • 是的,正如我所说,length(pam_fit$clustering) 不等于nrow(dat3),因此mutate 会出错。你需要找到一种方法来加入这两件事。

标签: r cluster-analysis dplyr


【解决方案1】:

如果您查看 dat,每个 ID 都有多个观察值,并且您正在尝试根据其疾病列将 ID 划分为集群。所以你的集群结果应该和你的id一样长,如果你想总结你的结果,你就按集群来。

要将表格放在一起,请执行以下操作:

library(cluster)
library(tidyverse)

pam_fit <- pam(daisy(dat2,"gower"), diss = TRUE, 2)  # performs cluster analysis

pam_results <- as.data.frame.matrix(table(dat)) %>%
mutate(cluster = pam_fit$clustering) %>%
group_by(cluster) %>%
do(the_summary = summary(.),freq = colSums(.))

这给出了总结:

pam_results$freq
[[1]]
  chest pain   depression          flu     headache    infection inflammation 
           4            5            4            3            5            3 
        pain      cluster 
           5            5 

[[2]]
  chest pain   depression          flu     headache    infection inflammation 
           1            2            2            2            2            2 
        pain      cluster 
           0            4 

如果你只需要频率,你可以这样做:

aggregate(as.data.frame.matrix(dat2[,-1]),list(cluster=pam_fit$clustering),sum)
      cluster depression flu headache infection inflammation pain
    1       1          5   4        3         5            3    5
    2       2          2   2        2         2            2    0

或 dplyr 解决方案:

as.data.frame.matrix(dat2[,-1]) %>% 
mutate(cluster=pam_fit$clustering) %>%
group_by(cluster) %>%
summarize_all(sum)

# A tibble: 2 x 7
  cluster depression   flu headache infection inflammation  pain
    <int>      <int> <int>    <int>     <int>        <int> <int>
1       1          5     4        3         5            3     5
2       2          2     2        2         2            2     0

【讨论】:

  • 很抱歉回复晚了,但我没有时间处理这个问题。无论如何,当我使用您的解决方案时,数据框中的第二列包含如下文本: c("Min. :1 ", "1st Qu.:1 ", "Median :1", "Mean :1", "3rd Qu .:1 "。但是,我想看到的是疾病的名称及其频率。这可能吗?
  • 如果你想要一个频率,你需要的不是一个摘要而是一个总和。查看编辑后的答案
猜你喜欢
  • 2017-05-08
  • 2020-03-23
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 2015-06-30
  • 1970-01-01
  • 2020-05-13
相关资源
最近更新 更多