R语言根据聚类结果生成对应聚类特征向量的实现方法咨询
需求实现R代码方案
以下代码基于tidyverse套件实现,运行前请先执行install.packages("tidyverse")安装依赖。
1. 互斥聚类场景(多列聚类结果)
适用于聚类结果分为多列存储、每个样本仅属于一个聚类的情况:
library(tidyverse) # 构造示例数据,可替换为你的真实数据 df1 <- tibble( A1 = c(0,0,33,0,0,0), A2 = c(0,20,0,0,0,12), A3 = c(0,34,0,0,0,57), A4 = c(15,0,7,0,0,0), A5 = c(0,0,0,85,94,0), C1 = c(1,2,1,3,3,2), C2 = c(1,2,1,2,2,2) ) # 提取特征列、聚类列名 feature_cols <- str_subset(colnames(df1), "^A") cluster_cols <- str_subset(colnames(df1), "^C") # 生成所有聚类对应的特征向量 result1 <- map(cluster_cols, function(cl_col){ cluster_ids <- unique(df1[[cl_col]]) %>% sort() map(cluster_ids, function(cid){ sub_df <- filter(df1, !!sym(cl_col) == cid) feature_cols[colSums(sub_df[feature_cols] != 0) > 0] }) %>% set_names(paste0(cl_col, cluster_ids)) }) %>% flatten() # 将生成的向量写入全局环境,可直接调用c11/c12/c13/c21/c22 list2env(result1, envir = .GlobalEnv) # 打印结果查看 print(result1)
运行后输出格式和要求完全一致:
$c11 [1] "A1" "A4" $c12 [1] "A2" "A3" $c13 [1] "A5" $c21 [1] "A1" "A4" $c22 [1] "A2" "A3" "A5"
2. 非互斥聚类场景(单列多标签逗号分隔)
适用于样本可属于多个聚类、聚类标签用逗号分隔存储的情况:
library(tidyverse) # 构造示例数据,可替换为你的真实数据 df2 <- tibble( A1 = c(0,0,33,28,0,0), A2 = c(30,20,0,0,0,12), A3 = c(0,34,0,0,0,57), A4 = c(15,0,7,0,0,0), A5 = c(0,0,0,85,94,0), C = c("1,2","2","1","3,1","3","2,3") ) # 提取特征列名 feature_cols <- str_subset(colnames(df2), "^A") # 拆分多标签为长表格式 df2_long <- df2 %>% separate_rows(C, sep = ",", convert = TRUE) # 按聚类分组生成特征向量 result2 <- df2_long %>% group_by(C) %>% summarise(features = list(feature_cols[colSums(cur_data()[feature_cols] != 0) > 0])) %>% deframe() %>% set_names(paste0("c", names(.))) # 将生成的向量写入全局环境,可直接调用c1/c2/c3 list2env(result2, envir = .GlobalEnv) # 打印结果查看 print(result2)
运行后输出格式和要求完全一致:
$c1 [1] "A1" "A2" "A4" "A5" $c2 [1] "A2" "A3" "A4" $c3 [1] "A1" "A2" "A3" "A5"
内容的提问来源于stack exchange,提问作者ncnc_2020
相关产品推荐
相关产品推荐

