Как ускорить обработку списка элементов в R? - PullRequest
2 голосов
/ 25 мая 2020

Рассмотрим следующий случай.

Есть список тегов, которые должны быть обработаны. Вот я использовал "for" l oop, и он работает для небольших списков. Но для списков с миллионом элементов это слишком долго. Как ускорить такую ​​обработку.

# 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 ]

2 голосов
/ 25 мая 2020

Может быть, использование gsub может быть быстрее?

gsub(",+", ",", gsub(" +|^,+|,+$", "", list_tags_original))
#[1] "tag1,tag2,tag3" "tag3,tag4"      "tag5"          
1 голос
/ 25 мая 2020

Это определенно будет быстрее, чем for l oop:

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

Ошибки в for l oop следующие:

1) str_split trimws функций, которые векторизованы, но вы используете их только для одного элемента в for l oop.

2) Никогда не увеличивайте ваши объекты в for l oop, list_tags_adjusted увеличивается на 1 размер на каждой итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...