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

