在R中拆分没有分隔符的字符串

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)

我想从这些字符串中提取某些信息 -

  1. 首先,两个大写字母字符(在这种情况下,总是"AW")
  2. 试验是用于校准("Callibration")还是数据收集 - 如果是后者,使用了哪种条件("Experiment1""Experiment2")
  3. 在该特定试验("Bino""monL")中使用了哪个子条件
  4. 重复子条件("1""2")

我首先尝试使用strsplit,但这似乎只适用于具有常规分隔符的情况,例如"_".substring似乎更适合我的需要,但实际上没有工作,因为分裂不会发生在常规的地方("Experiment1"十一个元素长,"Callibration"十二个).

我怀疑使用正则表达式可能就是答案,但我不知道如何解释分割之间的不同长度.

Sve*_*ein 5

您可以逐个提取信息:

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)

  • @luser正则表达式是一个非常强大的工具。学习将是值得的。 (2认同)

G. *_*eck 5

以下是一些不同的解决方案:

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)

修订:

  • 纠正和第二种解决方案.
  • 第三种方案.