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

在R中按site分组合并sp列无重复值并保留对应ID

按site分组合并去重物种列的高效实现方案

需求回顾

现有包含site、id、sp列的R语言DataFrame,其中sp列存储逗号分隔的物种名称。需要按site分组,将每组所有sp值合并并去除重复项,最终每个site仅保留一行记录。

方案1:tidyverse 实现(易读性优先)

使用dplyr+tidyr+stringr的组合,代码逻辑清晰,适合常规数据量:

library(tidyverse)

# 构造示例数据
df <- tibble(
  site = c("A", "A", "B", "B", "B"),
  id = c(1, 2, 3, 4, 5),
  sp = c("橡树,松树", "松树,桦树", "柳树,杨树", "杨树,槐树", "柳树,槐树")
)

# 处理流程
df_processed <- df %>%
  # 将逗号分隔的物种拆分为单独行
  separate_rows(sp, sep = ",") %>%
  # 去除物种名称前后的空格(若存在)
  mutate(sp = str_trim(sp)) %>%
  # 按site分组,去重物种
  group_by(site) %>%
  distinct(sp) %>%
  # 将去重后的物种合并为逗号分隔的字符串
  summarise(sp = str_c(sp, collapse = ","))

方案2:data.table 实现(性能优先)

如果数据量较大(百万级及以上),data.table的处理速度更优:

library(data.table)

# 构造示例数据
df <- data.table(
  site = c("A", "A", "B", "B", "B"),
  id = c(1, 2, 3, 4, 5),
  sp = c("橡树,松树", "松树,桦树", "柳树,杨树", "杨树,槐树", "柳树,槐树")
)

# 处理流程
df_processed <- df[, .(sp = trimws(unlist(strsplit(sp, ",")))), by = site][, .(sp = paste(unique(sp), collapse = ",")), by = site]

关键优化点

  • 先拆分再去重:避免直接合并长字符串后再去重,减少内存占用和计算量
  • 去除空格:处理sp列可能存在的前后空格问题,确保去重准确
  • 选择合适工具:常规数据用tidyverse保证可读性,大数据用data.table提升效率

内容的提问来源于stack exchange,提问作者darrinK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:50:38