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

