lus*_*ser 2 regex string split r
我有一个字符向量R,每个元素都包含一个字符串 - 让我们使用这个例子:
my.files <- c("AWCallibration#NoneBino-3", "AWExperiment1#NoneBino-1", "AWExperiment2#NonemonL-2"
)
Run Code Online (Sandbox Code Playgroud)
我想从这些字符串中提取某些信息 -
"AW")"Callibration")还是数据收集 - 如果是后者,使用了哪种条件("Experiment1"或"Experiment2")"Bino"或"monL")中使用了哪个子条件"1"或"2")我首先尝试使用strsplit,但这似乎只适用于具有常规分隔符的情况,例如"_".substring似乎更适合我的需要,但实际上没有工作,因为分裂不会发生在常规的地方("Experiment1"十一个元素长,"Callibration"十二个).
我怀疑使用正则表达式可能就是答案,但我不知道如何解释分割之间的不同长度.
您可以逐个提取信息:
first <- substr(my.files, 1, 2)
# [1] "AW" "AW" "AW"
second <- sub("^..(.*)#.*", "\\1", my.files)
# [1] "Callibration" "Experiment1" "Experiment2"
third <- sub("^.*#None(.*)-\\d+$", "\\1", my.files)
# [1] "Bino" "Bino" "monL"
fourth <- sub(".*-(\\d+)$", "\\1", my.files)
# [1] "3" "1" "2"
Run Code Online (Sandbox Code Playgroud)
一体化命令:
strsplit(my.files, "(?<=^..)(?=[A-Z])|#None|-", perl = TRUE)
# [[1]]
# [1] "AW" "Callibration" "Bino" "3"
#
# [[2]]
# [1] "AW" "Experiment1" "Bino" "1"
#
# [[3]]
# [1] "AW" "Experiment2" "monL" "2"
Run Code Online (Sandbox Code Playgroud)
以下是一些不同的解决方案:
gsubfn :: strapplyc试试这个:
library(gsubfn)
pat <- "(..)(.*)#None(.*)-(.*)"
strapplyc(my.files, pat, simplify = rbind)
Run Code Online (Sandbox Code Playgroud)
这使:
[,1] [,2] [,3] [,4]
[1,] "AW" "Callibration" "Bino" "3"
[2,] "AW" "Experiment1" "Bino" "1"
[3,] "AW" "Experiment2" "monL" "2"
Run Code Online (Sandbox Code Playgroud)
请注意,在gsubfn包的开发版本中,有一个read.pattern命令可以使用上面的代码pat: read.pattern(text = my.files, pattern = pat, as.is = TRUE).
sub/strsplit这是一个替代解决方案.它在第二个字符后面插入一个减号,然后按减号或者分割每个条带#None:
my.files2 <- sub("(..)", "\\1-", my.files)
do.call(rbind, strsplit(my.files2, "-|#None"))
Run Code Online (Sandbox Code Playgroud)
这使:
[,1] [,2] [,3] [,4]
[1,] "AW" "Callibration" "Bino" "3"
[2,] "AW" "Experiment1" "Bino" "1"
[3,] "AW" "Experiment2" "monL" "2"
Run Code Online (Sandbox Code Playgroud)
gsub/read.table 这里我们用来gsub在前两个字符后插入一个减号,并#None用减号代替.然后我们使用read.table一个sep减去读取它:
withMinus <- gsub("^(..)|#None", "\\1-", my.files)
read.table(text = withMinus, sep = "-", as.is = TRUE)
V1 V2 V3 V4
1 AW Callibration Bino 3
2 AW Experiment1 Bino 1
3 AW Experiment2 monL 2
Run Code Online (Sandbox Code Playgroud)
修订: