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

如何用R语言正则表达式将字符串向量转为同类字符串分栏的数据框?

在R中自动分组相似字符串变体并生成数据框

核心思路

要实现这个需求,关键是先识别同一主题的字符串变体(比如所有和橙子相关的写法),再将每组变体整理成数据框的列。我们可以通过字符串标准化生成分组键,再利用分组和数据整理工具完成转换。

具体实现步骤

1. 加载必要工具包

用dplyr做分组处理,tidyr做列展开:

library(dplyr)
library(tidyr)

2. 定义字符串标准化函数

这个函数的作用是把不同变体的字符串转换成统一的分组键,消除大小写、空格、后缀(如juice、pie)的差异:

standardize_key <- function(x) {
  # 转小写,消除大小写差异
  x_lower <- tolower(x)
  # 移除末尾的常见后缀(可根据需求添加更多,比如cake、soda等)
  x_clean <- gsub("\\s*(juice|drink|tea|ade|pie)\\s*$", "", x_lower)
  # 移除所有空格,比如"grape fruit"转为"grapefruit"
  x_clean <- gsub("\\s", "", x_clean)
  # 移除末尾的复数s,比如"Apples"转为"apple"
  x_clean <- gsub("s$", "", x_clean)
  return(x_clean)
}

正则说明:

  • tolower(x):统一转为小写,忽略大小写差异。
  • \\s*(juice|drink|tea|ade|pie)\\s*$:匹配字符串末尾的后缀,\\s*匹配前后可能存在的空格,$限定匹配位置在字符串结尾,确保只移除末尾的后缀。
  • \\s:匹配任意空格,替换为空来消除空格差异。
  • s$:匹配末尾的复数s,替换为空来处理复数形式。

3. 处理原始数据

先定义你的原始字符串向量,再通过分组、整理生成目标数据框:

# 原始字符串向量
fruit_list <- c("orange", "Orange", "Orange juice", "orange juice", 
                "lemon drink", "Lemon", "lemonade", "apple pie", 
                "Apple", "Apples", "Grapefruit", "grape fruit", "Grapefruit tea")

# 转换为数据框并添加分组键
df <- tibble(str = fruit_list) %>%
  mutate(group_key = standardize_key(str))

# 按分组键聚合,把每组的字符串整理成列表
grouped_df <- df %>%
  group_by(group_key) %>%
  # 可选:按字符串长度排序,让短变体排在前面
  summarise(variants = list(str[order(nchar(str))])) %>%
  ungroup()

# 将列表展开为多列,不足的位置自动补NA
result_df <- grouped_df %>%
  unnest_wider(variants, names_sep = "_") %>%
  # 重命名列为column1、column2...
  rename_with(~paste0("column", gsub("variants_", "", .)), starts_with("variants_")) %>%
  # 移除分组键列(如果不需要保留)
  select(-group_key)

4. 查看结果

运行后result_df的结构就和你需求的示例一致:

print(result_df)
# 输出:
# # A tibble: 4 × 4
#   column1       column2       column3           column4      
#   <chr>         <chr>         <chr>             <chr>        
# 1 orange        Orange        Orange juice      orange juice 
# 2 lemon         Lemon         lemonade          lemon drink  
# 3 apple         Apple         Apples            apple pie    
# 4 grapefruit    Grapefruit    grape fruit       Grapefruit tea

(注:如果需要调整列的顺序或行的顺序,可以在unnest_wider前添加排序逻辑)

灵活调整

如果遇到特殊的字符串变体,只需修改standardize_key函数中的正则规则即可,比如添加更多后缀、处理特殊拼写等,大幅减少手动分组的工作量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:45:45