与R的样式传染媒介的分裂字符传染媒介

时间:2017-10-11 12:21:44

标签: r regex string split

我正在尝试编写一个函数,通过使用模式向量中的连续元素重复分割字符向量来构建矩阵。

让我们调用我正在尝试编写的函数str_split_vector()。这是我正在寻找的输出的一个例子:

char <- c("A & P | B & C @ D",
          "E & Q | F & G @ H",
          "I & R | J & K @ L")
splits <- c(" \\| ", " & ", " @ ")

str_split_vector(char, splits)
#      [,1]     [,2] [,3] [,4]
# [1,] "A & P"  "B"  "C"  "D" 
# [2,] "E & Q"  "F"  "G"  "H" 
# [3,] "I & R"  "J"  "K"  "L" 

char向量依次被每个模式拆分,保持"A & P"完整。 (尽管使用特定的正则表达式模式管理最后一位可能是最容易的。)

我只能通过一个非常特别的循环迭代地完成这个任务:

for(ii in 1:length(splits)) {
  if(ii == 1) {

    char_mat <- matrix(char)
    char_mat <- do.call(rbind, strsplit(char_mat[ , ii], splits[ii]))

  } else {

    char_mat <- cbind(char_mat[ , 1:ii - 1],
                      do.call(rbind, 
                              strsplit(char_mat[ , ii], splits[ii])
                              )
                      )
  }
}

这个过程看起来效率低下,因为我正在通过重复的char_mat调用“增长”cbind()。更糟糕的是,我发现如果不实际运行代码,几乎不可能理解发生了什么。

有没有更简单的方法来写这个,可能会忽略"A & P"不被拆分的要求?

1 个答案:

答案 0 :(得分:3)

也许以下是你想要的。没有循环。

str_split_vector <- function(x, y){
    s <- strsplit(x, paste(y, collapse = "|"))
    do.call(rbind, s)
}

str_split_vector(char, splits)
#     [,1] [,2] [,3] [,4] [,5]
#[1,] "A"  "P"  "B"  "C"  "D" 
#[2,] "E"  "Q"  "F"  "G"  "H" 
#[3,] "I"  "R"  "J"  "K"  "L"

使用分组并且不会对第一个&执行任何拆分的方法如下:

do.call(rbind, strsplit(gsub("(.*) \\| (.*) & (.*) @ (.*)", "\\1_\\2_\\3_\\4", char), "_"))

它基本上用下划线替换你想要拆分的字符,然后拆分那些下划线。