tidyr使用正则表达式将列值分隔为字符和数字

CPa*_*Pak 5 regex r tidyr

我想使用tidyr::separate和regex表达式分隔列值,但我是regex表达式的新手

df <- data.frame(A=c("enc0","enc10","enc25","enc100","harab0","harab25","harab100","requi0","requi25","requi100"), stringsAsFactors=F) 
Run Code Online (Sandbox Code Playgroud)

这就是我尝试过的

library(tidyr)
df %>%
   separate(A, c("name","value"), sep="[a-z]+")
Run Code Online (Sandbox Code Playgroud)

输出不好

   name value
1           0
2          10
3          25
4         100
5           0
# etc
Run Code Online (Sandbox Code Playgroud)

如何保存name列?

Wik*_*żew 8

您可以使用基于(?<=[a-z])(?=[0-9])环视的正则表达式tidyr::separate:

> tidyr::separate(df, A, into = c("name", "value"), "(?<=[a-z])(?=[0-9])")
    name value
1    enc     0
2    enc    10
3    enc    25
4    enc   100
5  harab     0
6  harab    25
7  harab   100
8  requi     0
9  requi    25
10 requi   100
Run Code Online (Sandbox Code Playgroud)

(?<=[a-z])(?=[0-9])模式的匹配位置字符串中右小写ASCII字母(之间(?<=[a-z]))和一个数字((?=[0-9])).这(?<=...)是一个积极的先行,需要在当前位置的左侧立即存在一些模式,并且(?=...)是一个正向前瞻,需要在当前位置的右侧立即存在其模式.因此,分割时字母和数字保持不变.

或者,您可以使用extract:

extract(df, A, into = c("name", "value"), "^([a-z]+)(\\d+)$")
Run Code Online (Sandbox Code Playgroud)

输出:

    name value
1    enc     0
2    enc    10
3    enc    25
4    enc   100
5  harab     0
6  harab    25
7  harab   100
8  requi     0
9  requi    25
10 requi   100
Run Code Online (Sandbox Code Playgroud)

^([a-z]+)(\\d+)$模式匹配:

  • ^ - 开始输入
  • ([a-z]+)- 捕获组1(列name):一个或多个小写ASCII字母
  • (\\d+)- 捕获组2(列value):一个或多个数字
  • $ - 字符串结尾.