我正在尝试编写一个函数,通过使用模式向量中的连续元素重复分割字符向量来构建矩阵。
让我们调用我正在尝试编写的函数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"
不被拆分的要求?
答案 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), "_"))
它基本上用下划线替换你想要拆分的字符,然后拆分那些下划线。