【问题标题】:Split character vector with vector of patterns in R用 R 中的模式向量拆分字符向量
【发布时间】:2017-10-11 12:21:43
【问题描述】:

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

让我们调用我正在尝试编写的函数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 &amp; 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 &amp; P"不被拆分的要求?

【问题讨论】:

  • str_split_vector 来自哪里?什么包?
  • 对不起,这只是我为我正在尝试编写的这个函数提出一个名称。我将编辑问题以明确说明。
  • 那么为什么"A &amp; P" 也没有被拆分呢?你在splits 中有" &amp; "
  • 喜欢这个? strsplit(char, paste(splits, collapse = "|")).
  • @DavidArenburg 对,所以理想情况下,我希望能够从strsplit() 的下一个输入中删除以前“拆分”的字符串。 (因此 char_mat[ , ii] 在 for 循环中。)

标签: r regex string split


【解决方案1】:

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

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"

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

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

它基本上用下划线替换您希望拆分的字符,然后在这些下划线上拆分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多