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

使用pivot_wider后生成多行重复数据,如何合并行并保留物种丰度数据以完成K均值聚类分析?

使用pivot_wider后生成多行重复数据,如何合并行并保留物种丰度数据以完成K均值聚类分析?

嘿Birk,我来帮你搞定这两个问题!先解决数据合并的事儿,再处理K均值聚类的部分~

第一步:按子样方ID合并行,汇总物种丰度

你之前尝试的group_by(ID)思路是对的,但可能是用法细节出了问题,导致丢了物种列。现在用dplyr的新语法across来处理,能精准对所有物种列求和,同时保留你需要的字段:

# 按ID分组,汇总每个物种的丰度总和(忽略NA)
df_merged <- df_wide %>%
  group_by(ID) %>%
  summarize(
    # 保留每个ID对应的第一个Number_ID(如果不需要可以删掉这行)
    Number_ID = first(Number_ID),
    # 对除了ID和Number_ID之外的所有列(也就是物种列)求和,NA按0处理
    across(-c(ID, Number_ID), ~sum(.x, na.rm = TRUE))
  ) %>%
  ungroup()

这段代码会把同一个ID(比如A_1)的所有行合并成一行,每个物种的丰度是该子样方内所有记录的总和,NA会被自动忽略(相当于当成0计算),完全符合你想要的结果格式。

如果你的dplyr版本比较旧,across用不了,可以换成summarize_at写法:

df_merged <- df_wide %>%
  group_by(ID) %>%
  summarize(
    Number_ID = first(Number_ID),
    summarize_at(vars(-group_cols(), -Number_ID), ~sum(.x, na.rm = TRUE))
  ) %>%
  ungroup()

第二步:处理NA并完成K均值聚类

合并后的df_merged里已经没有NA了(因为求和时na.rm=TRUE把NA都转化为有效数值了),接下来要注意:K均值只能用数值型的物种丰度数据,不能包含ID、Number_ID这类分类/标识列,所以先提取聚类用的数值列:

# 提取仅用于聚类的物种丰度列
cluster_data <- df_merged %>%
  select(-c(Number_ID, ID))

# 设置随机种子,保证聚类结果可重复
set.seed(123)
# 运行K均值聚类,k=8,nstart=25(尝试25次初始中心选最优解)
km.res <- kmeans(cluster_data, centers = 8, nstart = 25)

# 把聚类结果合并回原数据框,方便查看每个子样方属于哪个簇
df_merged$cluster <- km.res$cluster

现在你就能看到每个子样方(ID)对应的聚类分组了,后续还可以基于这个结果做可视化或者进一步分析~

备注:内容来源于stack exchange,提问作者Birk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:03:03