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

如何用R语言缩减数据集行数并合并分组字符列?

修正dplyr分组拼接字符串的代码

原始数据集

a1 <- c("a","a","a", "b", "c", "c", "d", "d", "d", "d")
b1 <- c(7, 7, 7,5, 4, 4, 3, 3, 3, 3)
c1 <- c("A","B", "C", "D", "E", "F", "B", "C", "EE", "F")
m1 <- data.frame(a1, b1, c1)

期望输出

a <- c("a","b", "c", "d")
b <- c(7, 5, 4, 3)
c <- c("A; B; C","D", "E; F", "B; C; EE; F")
m <- data.frame(a, b, c)

出错的代码

library(dplyr)
m2 <-m |> 
  summarise(c = gsub(", ", "", toString(c1)), .by=c(a1,b1)) 

问题分析与修正

你的代码存在三个问题:

  1. 数据集名称错误:引用了不存在的m,应该使用定义好的m1
  2. 字符串替换逻辑错误:toString(c1)生成逗号分隔的字符串,需要把逗号替换为; 而非空字符串,否则会得到无分隔的拼接结果
  3. 未将结果列名重命名为期望的a、b、c

修正后的代码(方法1:修复原代码逻辑)

library(dplyr)
m2 <- m1 |> 
  summarise(c = gsub(", ", "; ", toString(c1)), .by = c(a1, b1))
# 重命名列名以匹配期望结果
names(m2) <- c("a", "b", "c")

修正后的代码(方法2:用stringr更直观拼接)

借助stringr包的str_c函数,可以直接指定拼接分隔符,省去替换步骤:

library(dplyr)
library(stringr) # 若dplyr未自动加载可手动调用

m2 <- m1 |> 
  summarise(c = str_c(c1, collapse = "; "), .by = c(a1, b1)) |> 
  rename(a = a1, b = b1)

兼容低版本dplyr的写法

如果你的dplyr版本低于1.1.0,不支持.by参数,可改用group_by语法:

library(dplyr)
library(stringr)

m2 <- m1 |> 
  group_by(a1, b1) |> 
  summarise(c = str_c(c1, collapse = "; ")) |> 
  ungroup() |> 
  rename(a = a1, b = b1)

运行上述代码后,m2的结构和内容就会和你期望的m一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:15:22