在交替索引上拆分字符串

时间:2018-04-26 13:26:40

标签: r string split

我有一个类似于"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个不同的单词,它就不会很好。有更好的方法吗?

5 个答案:

答案 0 :(得分:5)

您可以使用gsub将交替的字符捕获到同一组中:

gsub("(.)(.)?", "\\1", string)
#[1] "Hello"
gsub("(.)(.)?", "\\2", string)
#[1] "Lemon"

答案 1 :(得分:4)

您可以使用TRUEFALSE进行索引,即

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

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

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

答案 2 :(得分:2)

考虑到您的问题是如何分成两个以上的单词,您应该使用split函数。使用示例数据可能会有点混乱,因为您选择将一个变量命名为“split”。在下面的块中,第一个'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"

答案 3 :(得分:1)

试试这段代码:

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

它在字符串string

中追加偶数和奇数位置

答案 4 :(得分:1)

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

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