如何按最后一个空格分隔符拆分R数据框的Metric列?
拆分R数据框Metric列生成新列的解决方案
我明白你遇到的问题了——你想把Metric列拆分成「指标名称」和「Line」部分,同时保留原来的Values列,但是用str_split_fixed按空格拆成3份的方法没达到预期。咱们一起来解决这个问题:
原始数据框
df = data.frame(Metric = c("Profit before tax 240", "Earnings per share 0.240" , "EBITDA Margin 37%"), Values =c(5, 1, 3))
展示效果:
Metric Values Profit before tax 240 5 Earnings per share 0.240 1 EBITDA Margin 37% 3
期望的目标结构
你想要生成包含Metric(指标文本)、Values(原数值)、Line(后面的数字/百分比)的三列数据框,大致如下:
Metric Values Line 1 Profit before tax 5 240 2 Earnings per share 1 0.240 3 EBITDA Margin 3 37%
为什么str_split_fixed(df$Metric, " ", 3)不行?
这个函数是按空格固定拆分3份,比如第一行会拆成["Profit", "before", "tax 240"],这显然不是你想要的——你需要的是把最后一个空格前面的所有文本作为Metric,后面的内容作为Line,而不是按固定数量拆分。
可行的解决方案
这里提供两种简单的实现方法,都依赖stringr包(你已经在使用了),也可以结合tidyr让代码更简洁:
方法1:用tidyr::separate结合正则拆分
利用正则匹配「最后一个空格」,把Metric列拆分成两部分:
library(tidyr) library(stringr) # 原始数据 df = data.frame(Metric = c("Profit before tax 240", "Earnings per share 0.240" , "EBITDA Margin 37%"), Values =c(5, 1, 3)) # 拆分Metric列,sep参数用正则匹配最后一个空格 df_new <- df %>% separate(Metric, into = c("Metric", "Line"), sep = "\\s(?=[^\\s]+$)", extra = "merge") # 查看结果 print(df_new)
输出结果:
Metric Line Values 1 Profit before tax 240 5 2 Earnings per share 0.240 1 3 EBITDA Margin 37% 3
方法2:用stringr的提取/移除函数单独处理
如果你不想用tidyr,可以直接用stringr的函数分别提取Line和修改Metric:
library(stringr) # 原始数据 df = data.frame(Metric = c("Profit before tax 240", "Earnings per share 0.240" , "EBITDA Margin 37%"), Values =c(5, 1, 3)) # 提取最后一个非空格部分作为Line列 df$Line <- str_extract(df$Metric, "\\S+$") # 移除Metric列最后一个空格及后面的内容,得到纯指标名称 df$Metric <- str_remove(df$Metric, "\\s+\\S+$") # 调整列顺序为你想要的Metric、Values、Line df_new <- df[, c("Metric", "Values", "Line")] # 查看结果 print(df_new)
这个方法也能得到和上面完全一样的结果。
补充说明
- 正则
\\s(?=[^\\s]+$)的意思是:匹配一个空格,且这个空格后面跟着「非空格字符直到行尾」,也就是匹配最后一个空格。 str_extract(df$Metric, "\\S+$")是提取行尾的所有非空格字符,也就是你需要的Line部分。
内容的提问来源于stack exchange,提问作者Adni
相关产品推荐
相关产品推荐

