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

R语言字符串分割求助:如何从字符向量生成规整DataFrame

解决方案:利用正则捕获组提取固定结构的字段

针对你的问题,核心思路是抓住字符串的固定结构特征:每个条目都是「数字+x + 产品名 + R + 数字」,而且价格前的R是位于字符串末尾的固定标识(带前后空格)——不管产品名里有没有大写R,我们都可以通过正则表达式的捕获组来精准提取三个关键字段:数量、产品名、价格。

具体实现代码

方法1:使用stringr包(推荐,语法更直观)

先加载stringr,然后用正则匹配提取:

# 你的示例数据(新增一个含大写R的产品名测试)
items <- c(
  "1x Tomatoes 1kg R 16", 
  "1x Oyster Mushroom R 20", 
  "1x Potatoes 1 kg R 15",
  "2x Rich Rye Bread R 30"
)

library(stringr)

# 定义正则模式,捕获三个分组:数量、产品名、价格
pattern <- "^(\\d+)x (.*) R (\\d+)$"

# 提取匹配结果
matches <- str_match(items, pattern)

# 转换为DataFrame
df <- data.frame(
  Quantity = as.integer(matches[, 2]),
  Product_Name = matches[, 3],
  Price = as.integer(matches[, 4]),
  stringsAsFactors = FALSE
)

print(df)

运行后输出:

Quantity    Product_Name Price
1        1    Tomatoes 1kg    16
2        1 Oyster Mushroom    20
3        1   Potatoes 1 kg    15
4        2   Rich Rye Bread    30

方法2:使用基础R的strcapture(无需额外包)

如果不想加载第三方包,可以用基础R的strcapture函数直接生成DataFrame:

items <- c(
  "1x Tomatoes 1kg R 16", 
  "1x Oyster Mushroom R 20", 
  "1x Potatoes 1 kg R 15",
  "2x Rich Rye Bread R 30"
)

pattern <- "^(\\d+)x (.*) R (\\d+)$"

df <- strcapture(
  pattern = pattern,
  x = items,
  proto = data.frame(
    Quantity = integer(),
    Product_Name = character(),
    Price = integer()
  )
)

正则模式解释

^(\\d+)x (.*) R (\\d+)$ 各部分的含义:

  • ^:匹配字符串开头,确保从第一个字符开始匹配
  • (\\d+):捕获1个或多个数字,对应「数量」字段
  • x :匹配固定的"x "(带空格),避免和产品名中的字母x混淆
  • (.*):贪婪匹配任意字符,直到遇到最后一个R,这部分就是我们要的「产品名」(不管里面有没有大写R)
  • R:匹配价格前的固定标识(空格+R+空格),作为产品名和价格的分隔符
  • (\\d+)$:捕获字符串末尾的1个或多个数字,对应「价格」字段

注意事项

这个方案的前提是你的所有数据都符合「最后一个R是价格前缀」的结构,如果有例外(比如价格前的R没有空格、或者产品名末尾刚好是R),可以根据实际情况微调正则模式,比如把R改成\\sR\\s来匹配任意空白符,或者调整捕获组的贪婪/非贪婪模式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:12:33