如何用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))
问题分析与修正
你的代码存在三个问题:
- 数据集名称错误:引用了不存在的
m,应该使用定义好的m1 - 字符串替换逻辑错误:
toString(c1)生成逗号分隔的字符串,需要把逗号替换为;而非空字符串,否则会得到无分隔的拼接结果 - 未将结果列名重命名为期望的
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
相关产品推荐
相关产品推荐

