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

