Разбить строку по чередующемуся индексу - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть строка, похожая на "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 голосов
/ 28 апреля 2018

Другой способ, использующий вашу переменную split, будет работать с любым количеством слов:

N <- 2
apply(matrix(split,N),1,paste,collapse="")
# [1] "Hello" "Lemon"
0 голосов
/ 26 апреля 2018

Учитывая, что ваш вопрос состоит в том, как разбить более двух слов, вам следует использовать функцию 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"
0 голосов
/ 26 апреля 2018

Попробуйте этот код:

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

Добавляет четные и нечетные позиции в строке string

0 голосов
/ 26 апреля 2018

Вы можете использовать gsub для захвата чередующихся символов в одну группу:

gsub("(.)(.)?", "\\1", string)
#[1] "Hello"
gsub("(.)(.)?", "\\2", string)
#[1] "Lemon"
0 голосов
/ 26 апреля 2018

Вы можете сделать это, используя TRUE и FALSE для индексации, т.е.

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

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

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