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

如何在SQL及R中按列分组拼接另一列的值?

问题描述

我有如下R数据框:

df <- data.frame(scientific_name = c("Mandevilla grazielae",
                                     "Aosa parvifolia",
                                     "Mandevilla grazielae",
                                     "Dyckia ebracteata"), 
                 collection_number = c("254", "658","445", "568"))

希望将同一植物的采集编号合并到名为vouchers的列中,得到如下结果:

scientific_name       vouchers
Mandevilla grazielae  254, 445
Aosa parvifolia       658
Dyckia ebracteata     568

目前我尝试了以下操作:

x <- sqldf('SELECT * FROM df GROUP BY scientific_name ORDER BY scientific_name ASC')

还尝试统计采集编号数量:

x <- sqldf('SELECT scientific_name, COUNT(collection_number) 
            FROM df GROUP BY scientific_name ORDER BY scientific_name ASC')

我想知道有没有类似COUNT的函数,能把collection_number列的值拼接成vouchers列,试过CONCAT但没用,求解答!

解决方案

方法1:sqldf 实现(使用GROUP_CONCAT)

sqldf默认调用SQLite引擎,SQLite内置的GROUP_CONCAT函数就是用来分组拼接字符串的,语法和COUNT类似,直接指定要拼接的列和分隔符即可:

library(sqldf)
x <- sqldf('SELECT scientific_name, GROUP_CONCAT(collection_number, ", ") AS vouchers 
            FROM df GROUP BY scientific_name ORDER BY scientific_name ASC')

其中", "是拼接时的分隔符,可根据需求调整。

方法2:dplyr 实现(tidyverse 风格)

如果更习惯R的原生数据处理语法,用dplyr的分组汇总更直观:

library(dplyr)
x <- df %>%
  group_by(scientific_name) %>%
  summarise(vouchers = paste(collection_number, collapse = ", "), .groups = "drop") %>%
  arrange(scientific_name)

方法3:Base R 实现

无需额外包,用base R的aggregate函数也能完成:

x <- aggregate(collection_number ~ scientific_name, data = df, 
               FUN = function(x) paste(x, collapse = ", "))
colnames(x)[2] <- "vouchers"
x <- x[order(x$scientific_name), ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:51:32