在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
相关产品推荐
相关产品推荐

