在交替索引处拆分字符串

3
我有一个类似于"HLeelmloon"的字符串,其中包含两个交织在一起的单词。如何将其分成两个单独的单词,以交替字母为界分割?
我可以使用strsplit()for循环来将交替的字母分配给两个新向量,然后连接列表,但这似乎非常冗长。
string <- "HLeelmloon"
split<-el(strsplit(string,''))

> split
[1] "H" "L" "e" "e" "l" "m" "l" "o" "o" "n"

word1<-c()
word2<-c()
for(i in 1:length(split)){
  if(i %% 2 == 1){
    word1<-append(word1, split[i])
  } else {
    word2<-append(word2, split[i])
  }
}

word1 = paste0(word1, collapse = '')
word2 = paste0(word2, collapse = '')

> word1
[1] "Hello"
> word2
[1] "Lemon"

我的问题是这种方法不太优雅,并且如果我想将字符串拆分成N个不同的单词,它无法良好地扩展。有更好的方法吗?


“N个不同的单词” - 你能举个例子吗?此外,这些单词是否总是有相同数量的字母? - zx8754
能够说N=3,并将字符串“abc”拆分为“a”,“b”和“c”。 - Andrew Haynes
5个回答

5
您可以使用gsub将交替字符捕获到同一组中:
gsub("(.)(.)?", "\\1", string)
#[1] "Hello"
gsub("(.)(.)?", "\\2", string)
#[1] "Lemon"

这也可以通过使用额外的(.)来扩展到多个单词,例如:gsub("(.)(.)(.)?", "\\3", "abcabc")返回cc - Andrew Haynes

4

您可以使用TRUEFALSE进行索引,例如:

v1 = strsplit(string, '')[[1]]

paste(v1[c(TRUE, FALSE)], collapse = '')
#[1] "Hello"

paste(v1[c(FALSE, TRUE)], collapse = '')
#[1] "Lemon"

1
这正是我正在寻找的技巧,但我选择了@Mike H.的答案,因为它可以扩展到超过2个单词。 - Andrew Haynes

2

如果您想要将文本分割成两个以上的单词,应该使用split函数。在您提供的示例数据中,由于您选择将一个变量命名为“split”,因此可能会有些困惑。在下面的代码块中,第一个“split”是函数,第二个是您的分割变量。

number_of_words <- 2
lapply(split(split,1:number_of_words),paste0,collapse='')

$`1`
[1] "Hello"

$`2`
[1] "Lemon"

number_of_words <- 3
lapply(split(split,1:number_of_words),paste0,collapse='')
$`1`
[1] "Heln"

$`2`
[1] "Llo"

$`3`
[1] "emo"

为避免混淆,以下是同样的代码但没有命名为split的变量:
number_of_words <- 2
lapply(split(el(strsplit(string,'')),1:number_of_words),paste0,collapse='')
$`1`
[1] "Hello"

$`2`
[1] "Lemon"

1

Try this code:

paste0(split[seq(1,nchar(string),by = 2)],collapse="")
[1] "Hello"
> paste0(split[seq(2,nchar(string),by = 2)],collapse="")
[1] "Lemon"

它将字符串 string 中的偶数和奇数位置添加在一起。

1

另一种使用split变量的方法,适用于任意数量的单词:

N <- 2
apply(matrix(split,N),1,paste,collapse="")
# [1] "Hello" "Lemon"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接