如何在dplyr中执行多条件替换?以及如何在变量聚类图上叠加样本以展示样本所属聚类?
问题1:如何在dplyr中执行多条件替换?
在dplyr里处理多条件替换,最灵活的工具就是case_when(),它能按顺序匹配条件并执行替换,非常适合复杂的多规则场景。下面给你几个常用的实用例子:
1. 对单个列做多条件替换
假设你有一个包含score列的数据框,想把分数划分成不同等级:
library(dplyr) df <- tibble(score = c(55, 72, 90, 40, 85)) df <- df %>% mutate(grade = case_when( score >= 90 ~ "A", score >= 80 ~ "B", score >= 60 ~ "C", TRUE ~ "F" # 兜底条件,匹配所有未满足前面规则的情况 ))
注意:case_when()是按顺序匹配的,一定要把更严格的条件放在前面(比如先写>=90,再写>=80),否则会出现逻辑错误。
2. 基于多个列的条件替换
如果需要根据多列的值来替换目标列,比如根据age和income划分用户群体:
df <- tibble(age = c(22, 45, 60, 30), income = c(3000, 8000, 5000, 12000)) df <- df %>% mutate(group = case_when( age < 30 & income < 5000 ~ "Young Low-Income", age >= 30 & income >= 10000 ~ "High-Earning Adult", age >= 60 ~ "Senior", TRUE ~ "Other" ))
3. 批量替换多个列
如果要对多列执行相同的多条件替换,可以结合across()实现批量操作:
df <- tibble(test1 = c(50, 75, 95), test2 = c(65, 80, 40), test3 = c(85, 55, 70)) df <- df %>% mutate(across(starts_with("test"), ~ case_when( .x >= 90 ~ "Excellent", .x >= 70 ~ "Good", .x >= 60 ~ "Pass", TRUE ~ "Fail" )))
问题2:如何将样本叠加到变量聚类图上?
你的现有代码已经完成了物种得分的kmeans聚类和可视化,要把样本叠加进去,核心是先提取样本的DCA得分,然后将其投影到同一个聚类空间中。下面分两种场景给出实现方法:
步骤1:提取样本的DCA得分
首先从你的DCA对象中提取样本(sites)的得分,这和提取物种得分的逻辑一致:
site_scores <- as.data.frame(scores(DCA, "sites"))
这个site_scores数据框包含了每个样本在DCA1和DCA2轴上的坐标,和物种得分的坐标是完全对齐的。
场景1:仅展示样本位置(不分配聚类)
如果只是想直观看看样本在变量聚类图中的分布,直接在现有聚类图上叠加样本点即可:
library(ggplot2) # 先画出物种聚类的文本图 cluster_plot <- fviz_cluster(km.res, geom = "text", data = species.scores, labelsize = 4) # 叠加样本点(用半透明效果避免遮挡物种标签) cluster_plot + geom_point(data = site_scores, aes(x = DCA1, y = DCA2), color = "darkblue", alpha = 0.6, size = 2)
场景2:给样本分配聚类并展示
如果你想明确每个样本属于哪个物种聚类,可以通过计算样本到每个聚类中心的距离,将样本分配到最近的聚类:
library(dplyr) library(tidyr) # 提取kmeans的聚类中心,并添加聚类标签 cluster_centers <- as.data.frame(km.res$centers) %>% mutate(cluster = factor(1:nrow(.))) # 计算每个样本到所有聚类中心的距离,选择最近的聚类 site_clusters <- site_scores %>% rownames_to_column("sample_id") %>% cross_join(cluster_centers) %>% # 计算欧氏距离 mutate(distance = sqrt((DCA1 - DCA1.y)^2 + (DCA2 - DCA2.y)^2)) %>% group_by(sample_id) %>% slice_min(distance, n = 1) %>% # 取距离最近的聚类 ungroup() %>% select(sample_id, cluster, DCA1 = DCA1.x, DCA2 = DCA2.x) # 绘制叠加图:物种文本+带聚类颜色的样本点+聚类中心 ggplot() + # 物种聚类文本 geom_text(data = cbind(species.scores, cluster = factor(km.res$cluster)), aes(x = DCA1, y = DCA2, label = rownames(species.scores), color = cluster), size = 4) + # 样本点(按聚类着色) geom_point(data = site_clusters, aes(x = DCA1, y = DCA2, color = cluster), alpha = 0.7, size = 2, shape = 16) + # 聚类中心(用空心菱形标记) geom_point(data = cluster_centers, aes(x = DCA1, y = DCA2, color = cluster), shape = 23, fill = "white", size = 4) + theme_minimal() + labs(color = "Cluster", title = "Species Clusters with Sample Projections")
这样你就能清晰看到每个样本落在哪个物种聚类的区域里了。
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

