sidpat
sidpat

Reputation: 745

String transformation in R | Grouping words of a string

I want to group the words of string(given below)

text="Lorem,ipsum,dolor,sit,amet,consectetuer"

like this

textNew="Lorem ipsum,ipsum dolor,dolor sit,sit amet,amet consectetuer"

Thanks.

Upvotes: 3

Views: 227

Answers (5)

bartektartanus
bartektartanus

Reputation: 16080

You can use this functions from stringi package

require(stringi)
text <- "Lorem,ipsum,dolor,sit,amet,consectetuer"
words <- stri_split_fixed(text,",")[[1]]
stri_join(words[-length(words)]," ",words[-1],collapse = ", ")
## [1] "Lorem ipsum, ipsum dolor, dolor sit, sit amet, amet consectetuer"

some benchmarks :)

stringi <- function(){
  words <- stri_split_fixed(text,",")[[1]]
  stri_join(words[-length(words)]," ",words[-1],collapse = ", ")
}

gsubAvinash <- function(){
  f <- gsub(",([^,]*)", " \\1,\\1", text, perl=TRUE)
  result <- gsub(",[^,]*$", "", f, perl=TRUE)
  result
}

strsplitBeggineR <- function(){
  x <- strsplit(text, ",")[[1]]
  paste0(sapply(1:(length(x)-1), function(z) paste(x[c(z, z+1)], collapse = " ")), collapse = ",")
}

stringrAkrun <- function(){
  txt2 <- str_extract_all(text, "[^,]+")[[1]]
  paste(paste(txt2[-length(txt2)],txt2[-1],sep=" "), collapse=", ")
}

require(microbenchmark)
microbenchmark(stringi(), gsubAvinash(),strsplitBeggineR(),stringrAkrun())
Unit: microseconds
               expr     min       lq   median       uq     max neval
          stringi()   8.657  10.6090  16.5005  17.6730  41.058   100
      gsubAvinash()  14.506  17.1055  20.2105  22.2040  97.399   100
 strsplitBeggineR()  53.609  59.7755  64.9470  68.3105 121.767   100
     stringrAkrun() 148.036 157.4715 162.4885 168.2880 342.471   100

Upvotes: 2

akrun
akrun

Reputation: 887168

You could also do:

  library(stringr)
   txt2 <- str_extract_all(text, "[^,]+")[[1]]
   paste(paste(txt2[-length(txt2)],txt2[-1],sep=" "), collapse=", ")
   #[1] "Lorem ipsum, ipsum dolor, dolor sit, sit amet, amet consectetuer"

Or

  library(gsubfn)
   paste(strapply(text, "([^,]+),(?=([^,]+))", paste, backref= -2, perl=TRUE)[[1]], collapse=",")
   #[1] "Lorem ipsum,ipsum dolor,dolor sit,sit amet,amet consectetuer"

Upvotes: 2

Avinash Raj
Avinash Raj

Reputation: 174706

Through gsub function,

> text="Lorem,ipsum,dolor,sit,amet,consectetuer"
> f <- gsub(",([^,]*)", " \\1,\\1", text, perl=TRUE)
> result <- gsub(",[^,]*$", "", f, perl=TRUE)
> result
[1] "Lorem ipsum,ipsum dolor,dolor sit,sit amet,amet consectetuer"

Upvotes: 5

sidpat
sidpat

Reputation: 745

Ahh got something similar.

text="Lorem,ipsum,dolor,sit,amet,consectetuer"
text2 <- unlist(strsplit(text, ","))
textNew=paste0(sapply(1:(length(text2)-1),function(i,y=text2){paste(y[i],y[i+1])}),collapse=",")

Upvotes: 2

talat
talat

Reputation: 70266

Here's one option:

x <- strsplit(text, ",")[[1]]
paste0(sapply(1:(length(x)-1), function(z) paste(x[c(z, z+1)], collapse = " ")), collapse = ",")
[1] "Lorem ipsum,ipsum dolor,dolor sit,sit amet,amet consectetuer"

Upvotes: 4

Related Questions