使用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
相关产品推荐
相关产品推荐

