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

如何基于mid前缀将多行R数据框合并为分组单行数据?

R语言实现按mid前缀分组合并term字段

嘿,这需求在R里其实有好几种简单的实现方式,我给你整理了两种最常用的方案,都能完美达到你的要求:

方法一:使用tidyverse工具链(dplyr + stringr)

这是数据分析场景下最常用的方案,代码可读性高,扩展性强:

首先先定义你的原始数据框:

df <- structure(list(
  mid = c("text11", "text12", "text21", "text22", "text23"),
  term = c("test", "text", "section", "2", "sending")
), class = "data.frame", row.names = c(NA, -5L))

然后执行分组合并操作:

library(dplyr)
library(stringr)

result_df <- df %>%
  # 提取mid的前缀:用正则匹配开头的「text+单个数字」(比如text1、text2)
  mutate(mid_prefix = str_extract(mid, "^text\\d")) %>%
  # 按提取出的前缀分组
  group_by(mid_prefix) %>%
  # 将同组的term用空格连接成字符串
  summarise(term = str_c(term, collapse = " ")) %>%
  # 把列名改成需求里的mid
  rename(mid = mid_prefix) %>%
  # 取消分组,转回普通数据框(可选)
  ungroup()

# 查看结果
print(result_df)

代码解释:

  • str_extract(mid, "^text\\d"):精准提取mid字段的前缀,正则表达式^text\\d表示匹配以text开头且紧跟一个数字的部分,刚好对应你的text1、text2这类前缀。
  • group_by(mid_prefix):按提取出的前缀分组。
  • str_c(term, collapse = " "):把同组的所有term值用空格拼接成单个字符串。

方法二:使用Base R(无需额外安装包)

如果你不想加载第三方包,用Base R自带的函数也能实现:

同样先定义原始数据框,然后执行以下代码:

df <- structure(list(
  mid = c("text11", "text12", "text21", "text22", "text23"),
  term = c("test", "text", "section", "2", "sending")
), class = "data.frame", row.names = c(NA, -5L))

# 提取前缀:用sub函数去掉mid最后一位的数字
df$mid_prefix <- sub("(text\\d)\\d$", "\\1", df$mid)

# 按前缀分组合并term
result_df_base <- aggregate(term ~ mid_prefix, data = df, FUN = function(x) paste(x, collapse = " "))

# 重命名列名符合需求
colnames(result_df_base) <- c("mid", "term")

# 查看结果
print(result_df_base)

代码解释:

  • sub("(text\\d)\\d$", "\\1", df$mid):用正则表达式捕获text+数字的部分,替换掉末尾的数字,得到前缀。
  • aggregate(term ~ mid_prefix, ...):Base R里的分组聚合函数,指定按mid_prefix分组,用自定义函数把term合并成空格分隔的字符串。

两种方法最终都会得到你想要的结果:

mid               term
1 text1          test text
2 text2 section 2 sending

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:48:09