You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 08:37:35