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

