【问题标题】:Split a string on alternating index在交替索引上拆分字符串
【发布时间】:2018-04-26 13:26:39
【问题描述】:

我有一个类似于"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 个不同的词" - 你能举个例子吗?另外,单词总是有相同数量的字母吗?
  • 能够说N=3,并将字符串“abc”拆分为“a”、“b”和“c”

标签: r string split


【解决方案1】:

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

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

【讨论】:

  • 这也可以通过使用额外的(.)扩展为多个单词,例如:gsub("(.)(.)(.)?", "\\3", "abcabc")返回cc
【解决方案2】:

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

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

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

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

【讨论】:

  • 这正是我一直在寻找的技巧,但选择了@Mike H. 的答案,因为它可以扩展到超过 2 个单词
【解决方案3】:

考虑到您的问题是如何拆分成两个以上的单词,您应该使用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"

【讨论】:

    【解决方案4】:

    试试这个代码:

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

    它在字符串string中附加偶数和奇数位置

    【讨论】:

      【解决方案5】:

      另一种使用 split 变量的方法可以处理任意数量的单词:

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

      【讨论】:

        猜你喜欢
        • 2021-05-31
        • 2021-10-31
        • 1970-01-01
        • 1970-01-01
        • 2012-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多