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

如何在R语言中对含数字后缀的相似字符串分组并保留首次出现顺序

按去除后缀的名称分组并保留原首次出现顺序排序DataFrame

原始数据

首先构建示例数据:

var <- c('Peter','Ben','Mary','Peter.1','Ben.1','Mary.1','Peter.2','Ben.2','Mary.2')
v1 <- c(0.4, 0.6, 0.7, 0.3, 0.9, 0.2, 0.4, 0.6, 0.7)
v2 <- c(0.5, 0.4, 0.2, 0.5, 0.4, 0.2, 0.1, 0.4, 0.2)
df <- data.frame(var, v1, v2)

原始数据输出:

var  v1  v2
1   Peter 0.4 0.5
2     Ben 0.6 0.4
3    Mary 0.7 0.2
4 Peter.1 0.3 0.5
5   Ben.1 0.9 0.4
6  Mary.1 0.2 0.2
7 Peter.2 0.4 0.1
8   Ben.2 0.6 0.4
9  Mary.2 0.7 0.2

需求

需要按var列去除后缀(如.1、.2)后的名称分组,同时保留原数据中各组首次出现的顺序,最终得到如下排序结果:

var  v1  v2
1   Peter 0.4 0.5 # Peter首次出现排在第一
2 Peter.1 0.3 0.5
3 Peter.2 0.4 0.1
4     Ben 0.6 0.4 # Ben首次出现排在第二
5   Ben.1 0.9 0.4
6   Ben.2 0.6 0.4
7    Mary 0.7 0.2 # Mary首次出现排在第三
8  Mary.1 0.2 0.2
9  Mary.2 0.7 0.2

解决方案

方法1:Base R实现

无需额外包,通过正则提取前缀、转换因子排序:

# 提取每个var的前缀(去除.及后续内容)
df$prefix <- sub("\\..*", "", df$var)
# 将前缀转为因子,levels设为原数据中首次出现的顺序
df$prefix <- factor(df$prefix, levels = unique(df$prefix))
# 按前缀排序,相同前缀的行保留原数据中的顺序
df_sorted <- df[order(df$prefix), ]
# 移除临时的prefix列
df_sorted <- df_sorted[, setdiff(names(df_sorted), "prefix")]

方法2:dplyr包实现

适合熟悉tidyverse语法的用户:

library(dplyr)

df_sorted <- df %>%
  # 提取前缀
  mutate(prefix = sub("\\..*", "", var)) %>%
  # 按前缀的首次出现顺序排序,组内保持原顺序
  arrange(factor(prefix, levels = unique(prefix))) %>%
  # 移除临时列
  select(-prefix)

关键说明

  • sub("\\..*", "", var):用正则表达式匹配第一个.及其后的所有字符,替换为空,得到无后缀的前缀名称。
  • 将前缀转为因子并指定levels = unique(df$prefix):确保排序时遵循原数据中各组首次出现的顺序,而不是默认的字母序。
  • 排序操作(order或arrange)会保持相同前缀行的原始顺序,满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:05:21