在R语言中整合多份样方物种数据框,补全缺失物种值为0
在R语言中整合多样方物种丰度数据框(缺失值填充为0)
需求说明
我有多份对应不同样方的植物物种-盖度百分比数据框,想要将它们整合成一个统一的数据框:
- 所有样方出现过的物种作为列
- 每一行对应一个样方
- 原数据框中未出现的物种,在对应样方中填充为0
模拟数据如下(a和b分别代表两个样方,df是手动生成的目标格式):
# 生成样方a的数据 a.names <- c("spA","spB","spC","spD","spE") a <- t(data.frame(c(40,20,10,10,10), row.names = a.names)) row.names(a) <- "a.abund" # 生成样方b的数据 b.names <- c("spC","spD","spE","spF","spG","spH","spI") b <- t(data.frame(c(40,10,10,10,10,10,10), row.names = b.names)) row.names(b) <- "b.abund" # 目标格式示例 df.names <- c("spA","spB","spC","spD","spE","spF","spG","spH","spI") a.abund <- c(40,20,10,10,10,0,0,0,0) b.abund <- c(0,0,40,10,10,10,10,10,10) df <- t(data.frame(a.abund, b.abund, row.names = df.names))
解决方案
方法1:基础R原生实现
无需额外包,通过合并、补全列并填充0完成:
# 合并两个数据框,保留所有列 merged <- merge(a, b, by = "row.names", all = TRUE) # 设置行名并移除辅助列 row.names(merged) <- merged$Row.names merged <- merged[, -1] # 将缺失值NA替换为0 merged[is.na(merged)] <- 0 # 按物种名称排序列(可选,与目标格式对齐) merged <- merged[, sort(colnames(merged))]
方法2:使用tidyverse工具链
通过宽长格式转换实现,代码更简洁:
library(tidyverse) # 转换为长格式合并,再转回宽格式并填充0 bind_rows( as_tibble(a, rownames = "plot"), as_tibble(b, rownames = "plot") ) %>% pivot_longer(cols = -plot, names_to = "species", values_to = "abundance") %>% pivot_wider(names_from = "species", values_from = "abundance", values_fill = 0) %>% column_to_rownames("plot")
方法3:使用data.table快速处理
适合大数据量场景,处理效率更高:
library(data.table) # 转换为data.table并合并 dt_a <- as.data.table(a, keep.rownames = "plot") dt_b <- as.data.table(b, keep.rownames = "plot") merged_dt <- merge(dt_a, dt_b, by = "plot", all = TRUE) # 替换缺失值为0,设置行名 merged_dt[is.na(merged_dt)] <- 0 row.names(merged_dt) <- merged_dt$plot merged_dt <- merged_dt[, -"plot"] # 按物种名称排序列 merged_dt <- merged_dt[, sort(colnames(merged_dt)), with = FALSE]
以上任意方法运行后,均可得到与手动生成的df完全一致的结果。
内容的提问来源于stack exchange,提问作者fre1990
相关产品推荐
相关产品推荐

