首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于多变量的聚类观测

基于多变量的聚类观测
EN

Stack Overflow用户
提问于 2019-12-09 22:46:37
回答 2查看 162关注 0票数 1

我正在寻找一个r函数来根据两个变量在我的数据集中创建集群(希望“集群”是我想要做的事情的正确名称)。对于variable_1或variable_2,每两个值相同的观测都应该在同一个集群中。在下面的简单示例中,我基于variable_1和variable_2聚合了数据框架df。

代码语言:javascript
复制
df <- data.frame(variable_1=c("a","a","b","b","c","c","d","d","e","e"),variable_2=c("g1","g2","g1","g3","g2","g4","g4","g6","g7","g8"),value=rnorm(10))

df$clusters <- some_function_to_create_clusters(df[,c("variable_1","variable_2")])

结果应该是:

代码语言:javascript
复制
df$clusters <- c("clu1","clu1","clu1","clu1","clu1","clu1","clu1","clu1","clu2","clu2")
df

注意,第一个集群包含每个variable_1等于"a“、"b”、"c“或"d”的人:"a“和"b”合并在一起是因为他们共享"g1“(第1和第3行);"a”和"c“是因为共享"g2”(第2和5行);"c“和”d“是因为共享"g4”(第6和7行)。最后,在最后一个集群中,只有使用variable_1=="e“的观察,因为它们不与任何人共享variable_2。

为了澄清我打算做什么,我会更好地解释我的问题集。我要把县和附近的旅游景点结合起来。不同的县被不同的旅游景点( TA )所环绕,在同一县周围有许多旅游景点。但是这种由县和塔组成的“旅游集群”在这个国家的分布很少。请注意,一些遥远的县可能在同一集群内,由于县-旅游吸引联系的“链”效应。因此,我想找到那些“集群”,基于这个县的特性和旅游吸引力。

这看起来很简单,但我想不出如何实现。

非常感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-10 03:55:25

图像解

免责声明:我对problem完全陌生,所以可能有一个更好的解决这个问题的方法。然而,这似乎是可行的。

使用igraph包,我们可以使用graph_from_data_frame()函数对数据进行聚类,然后使用components提取集群。你还有一个额外的优势,那就是能够将集群可视化。

代码语言:javascript
复制
library(igraph)

graph <- graph_from_data_frame(df[, 1:2], directed = FALSE)

cmp <- components(graph)$membership

df$cluster <- cmp[df$variable_1]

plot(graph)

把它包装成一个函数

如果您想要将它作为一个函数来包装,这样的操作是可行的:

代码语言:javascript
复制
find_clusters <- function(x, y) {
  edges <- data.frame(from = x, to = y)
  graph <- igraph::graph_from_data_frame(edges, directed = FALSE)
  cmp <- igraph::components(graph)$membership
  return(cmp[x])
}

因此,使用上面作为注释发布的附加示例,我们有以下工作流:

代码语言:javascript
复制
library(dplyr)

df <- data.frame(
    variable_1 = c("a", "a", "b", "b", "c", "c", "d", "d", "e", "e", "f", "f"),
    variable_2 = c( "g1", "g2", "g1", "g3", "g2", "g4", "g4", "g6", "g7", "g8", "g9", "g12"),
    value = rnorm(12)
  )

df %>% 
  mutate(cluster = find_clusters(variable_1, variable_2))

#    variable_1 variable_2       value  cluster
# 1           a         g1 -0.03410073        1
# 2           a         g2  0.51261548        1
# 3           b         g1  0.06470451        1
# 4           b         g3 -1.97228101        1
# 5           c         g2 -0.39751063        1
# 6           c         g4  0.17761619        1
# 7           d         g4 -0.13771207        1
# 8           d         g6 -0.72183017        1
# 9           e         g7  0.09012701        2
# 10          e         g8  0.45763593        2
# 11          f         g9 -0.83172613        3
# 12          f        g12  2.83480352        3
票数 2
EN

Stack Overflow用户

发布于 2019-12-10 02:03:46

所以,我写了一个函数来实现我所需要的。它是丑陋的,但它正在起作用。如果有人有一个更好/更有效的解决方案,我将非常感激。

代码语言:javascript
复制
find_clusters <- function(original_df){

  find_clus <- original_df
  cluster_number <- 1
  find_clus$cluster <- "cl"
  i=1
  for(i in 1:nrow(find_clus)){
    if(nchar(find_clus$cluster[i])>2) next
    aux <- lapply(original_df,function(x){ which(x==x[i])})%>% reshape2::melt()
    idx <- aux$value %>%unique() %>%sort()
    j = 1
    while(j <= length(idx)){
      aux <- lapply(original_df,function(x){ which(x==x[idx[j]])})%>% reshape2::melt()
      idx <- c( idx, aux$value) %>%unique() %>% sort()
      j <- j+1
    }


    find_clus$cluster[idx] <- paste0("cl",sprintf("%04d",  cluster_number))
    cluster_number<- cluster_number +1
  }  
  return(find_clus$cluster)
}

因此,要找到应该编写的集群:

代码语言:javascript
复制
find_clusters(df[,c(1,2)])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59257760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档