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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 07:03:19