How speed up processing list of elements in R?

Viewed 56

Let see the following case.

There is a list of tags that should be processed. Here is I used "for" loop and it works for small lists. But for lists with a million elements it's too long. How to speed such kind of processing.

# 1. List of 'original' tags
list_tags_original <- c(",tag1, tag2,, tag3", "tag3, tag4,", "tag5")

# 2. List of 'adjusted' tags
list_tags_adjusted <- c()

# 3. Process each 'original' tags
for(i in 1:length(list_tags_original)) {

  # 3.1. List of selected tags
  list_tags_selected <- list_tags_original[i]

  # 3.2. Split on separate tags
  list_tags_selected <- trimws(unlist(str_split(list_tags_selected, ",")))

  # 3.3. Drop 'missing' tags
  list_tags_selected <- list_tags_selected[list_tags_selected != ""]

  # 3.4. Merge back into the string
  list_tags_selected <- paste0(list_tags_selected, collapse = ",")

  # 3.5. Add to list of 'adjusted' tags
  list_tags_adjusted <- c(list_tags_adjusted, list_tags_selected)

} # for

# 4. Result
list_tags_adjusted
#[1] "tag1,tag2,tag3" "tag3,tag4"      "tag5" 
2 Answers

Maybe using gsub can be faster?

gsub(",+", ",", gsub(" +|^,+|,+$", "", list_tags_original))
#[1] "tag1,tag2,tag3" "tag3,tag4"      "tag5"          

This will defintely be faster than for loop :

sapply(strsplit(list_tags_original, ',\\s*'), function(x) toString(x[x!='']))
#[1] "tag1, tag2, tag3" "tag3, tag4"       "tag5"  

The things wrong in for loop are :

1) str_split trimws functions which are vectorized but you are using it for only one element in for loop.

2) Never grow your objects in for loop, list_tags_adjusted is growing by size of 1 in each iteration.

Related