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

如何将长格式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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:24:33