如何将长格式data.frame转换为带物种存在/缺失标记的宽格式?
构造Plot×Species存在矩阵的解决方法
问题说明
原始数据:
tmp <- data.frame(x = c(51, 51, 13, 51, 51, 61), y = c(24, 24, 52, 24, 24, 13), plot=c("ua1", "ua1", "ua2", "ua1", "ua1", "ua3"), spp=c("sp1", "sp1", "sp2", "sp3", "sp4", "sp1"))
需求:
- 保留
x、y、plot列,将spp的唯一值转为新列 - 新列用1标记对应plot中存在该物种,0标记不存在,最终每个plot仅保留一行对应坐标
之前尝试tmp %>% pivot_wider(names_from = "spp", values_from = "plot")无法得到正确结果,仅返回物种所在plot名称,其余位置为NA。
期望输出:
data.frame(x = c(51, 13, 61), y = c(24, 52, 13), plot=c("ua1", "ua2", "ua3"), sp1=c(1, 0, 1), sp2=c(0, 1, 0), sp3=c(1, 0, 0), sp4=c(1, 0, 0))
解决方法
方法1:简洁的tidyverse流程
核心是先标记物种存在,去重重复的plot-spp组合,再转宽并填充缺失值为0:
library(tidyverse) tmp %>% mutate(exists = 1) %>% # 标记存在的物种 distinct(plot, spp, x, y, .keep_all = TRUE) %>% # 去重避免重复行 pivot_wider(names_from = spp, values_from = exists, values_fill = 0)
方法2:分步处理坐标与物种存在情况
如果需要更清晰的分步逻辑,可先提取每个plot的唯一坐标,再生成全量plot-spp组合并标记存在:
library(tidyverse) # 提取每个plot对应的唯一坐标 plot_coords <- tmp %>% distinct(plot, x, y) # 生成所有plot-spp组合,标记存在状态 spp_presence <- tmp %>% distinct(plot, spp) %>% mutate(exists = 1) %>% complete(plot, spp, fill = list(exists = 0)) # 补全缺失的组合并标记为0 # 合并坐标与存在状态,转宽后调整列顺序 spp_presence %>% left_join(plot_coords, by = "plot") %>% pivot_wider(names_from = spp, values_from = exists) %>% select(x, y, plot, everything())
两种方法均可得到符合需求的输出,方法1更适合原始数据中每个plot的x/y值重复但一致的场景。
内容的提问来源于stack exchange,提问作者hiperhiper
相关产品推荐
相关产品推荐

