我想使用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列?
您可以使用基于(?<=[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):一个或多个数字$ - 字符串结尾.