如何使用正则表达式和dplyr::separate按符合条件的特定空格拆分数据列
R 特定规则拆分数据列解决方案
问题核心原因
此前拆分时丢失字母、数字内容,是因为正则直接匹配了「字母+空格+数字」的完整序列,拆分操作会删除整段匹配到的内容。我们可以通过正则零宽断言定位符合要求的空格本身,不消耗前后的字符解决这个问题。
可直接运行的完整代码
library(tidyverse) df <- tibble( column = c("Current Assets 3a 10.001", "Cash and Equivalents 2b 1.009", "Debt 2.050" ) ) # 拆分实现 df %>% dplyr::separate( col = column, into = c("column1","column2","column3"), # 正则仅匹配前接字母、后接数字的空格 sep = "(?<=[[:alpha:]])\\s(?=[[:digit:]])", # 拆分后列数不足时右侧补NA fill = "right", # 自动转换列类型,将第三列转为数值 convert = TRUE )
输出结果
运行上述代码得到的输出和预期完全一致:
# A tibble: 3 × 3 column1 column2 column3 <chr> <chr> <dbl> 1 Current Assets 3a 10.0 2 Cash and Equivalents 2b 1.01 3 Debt <NA> 2.05
关键参数说明
- 正则
(?<=[[:alpha:]])\\s(?=[[:digit:]]):(?<=[[:alpha:]])是零宽正向后顾断言,限定空格前必须是字母;(?=[[:digit:]])是零宽正向前瞻断言,限定空格后必须是数字;两个断言都不会占用匹配字符,仅做位置判定,因此拆分不会丢失前后内容。 fill = "right":处理第三行只有两个拆分段的场景,自动在第二列补NA。convert = TRUE:自动将第三列的字符串格式数字转为数值类型,符合预期格式要求。
内容的提问来源于stack exchange,提问作者fabiominatto
相关产品推荐
相关产品推荐

