Как заменить несколько слов пробелами в R?

Вот пример:

drugs<-c("Lapatinib-Ditosylate", "Caffeic-Acid-Phenethyl-Ester", "Pazopanib-HCl", "D-Pantethine")

ads<-"These are recently new released drugs Lapatinib Ditosylate, Pazopanib HCl, and Caffeic Acid Phenethyl Ester"

Я хотел исправить названия лекарств в ads именами в drugs так, чтобы желаемый результат был таким:

"These are recently new released drugs Lapatinib-Ditosylate, Pazopanib-HCl, and Caffeic-Acid-Phenethyl-Ester"
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы создаете вектор слов, которые нужно заменить, то вы можете перебрать этот вектор и вектор слов, чтобы заменить их (drugs), заменяя все экземпляры одного элемента в каждом переходе цикла.

to_repl <- gsub('-', ' ', drugs)

for(i in seq_along(drugs))
  ads <- gsub(to_repl[i], drugs[i], ads)

ads
# "These are recently new released drugs Lapatinib-Ditosylate, Pazopanib-HCl, and Caffeic-Acid-Phenethyl-Ester"

Вопреки распространенному мнению, for-циклы в R не медленнее, чем lapply

f_lapply <- function(ads){
  to_repl <- gsub('-', ' ', drugs)
  invisible(lapply(seq_along(to_repl), function(i) {
    ads <<- gsub(to_repl[i], drugs[i], ads)
  }))
  ads
}
f_loop <- function(ads){
  to_repl <- gsub('-', ' ', drugs)
  for(i in seq_along(to_repl))
    ads <- gsub(to_repl[i], drugs[i], ads)
  ads
}

f_loop(ads) == f_lapply(ads)
# [1] TRUE

microbenchmark::microbenchmark(f_loop(ads), f_lapply(ads), times = 1e4)
# Unit: microseconds
#           expr    min      lq     mean  median      uq       max neval
#    f_loop(ads) 59.488  95.180 118.0793 107.487 120.205  7426.866 10000
#  f_lapply(ads) 69.333 114.462 147.9732 130.872 152.205 27283.670 10000

Или, используя более общие примеры:

loop_over <- 1:1e5
microbenchmark::microbenchmark(
  for_loop = {for(i in loop_over) 1},
  lapply   = {lapply(loop_over, function(x) 1)}
  )
# Unit: milliseconds
#      expr      min         lq       mean     median         uq       max neval
#  for_loop  4.66174   5.865842   7.725975   6.354867   7.449429  35.26807   100
#    lapply 94.09223 114.378778 125.149863 124.665128 134.217326 170.16889   100

loop_over <- 1:1e5
microbenchmark::microbenchmark(
  for_loop = {y <- numeric(1e5); for(i in seq_along(loop_over)) y[i] <- loop_over[i]},
  lapply   = {lapply(loop_over, function(x) x)}
  )
# Unit: milliseconds
#      expr      min       lq     mean   median       uq     max neval
#  for_loop 11.00184 11.49455 15.24015 12.10461 15.26050 134.139   100
#    lapply 71.41820 81.14660 93.64569 87.05162 98.59295 357.219   100

Это также можно сделать с помощью lapply(), который будет быстрее, чем цикл for. Изменив ответ @IceCreamToucan, это можно сделать в lapply следующим образом.

to_repl <- gsub('-', ' ', drugs)

invisible(lapply(seq_along(to_repl), function(i) {
  ads <<- gsub(to_repl[i], drugs[i], ads)
}))

# [1] "These are recently new released drugs Lapatinib-Ditosylate, Pazopanib-HCl, and Caffeic-Acid-Phenethyl-Ester"

Микробенчмарк

Unit: microseconds
     expr      min        lq      mean   median        uq      max neval
   lapply   80.514   87.4935  110.1103   93.304   96.1995 1902.861   100
 for.loop 2285.164 2318.5665 2463.1554 2338.216 2377.4120 7510.763   100
lapply не быстрее, чем for-петля. Смотрите первый ответ здесь: stackoverflow.com/questions/42393658/… или эта статья
IceCreamToucan 10.04.2019 22:37

@IceCreamToucan Я обычно заметил, что «lapply» работает быстрее, чем цикл for. Может быть, не в случае приведенного вами примера. Но тут конечно быстрее.

cropgen 10.04.2019 22:52

Я бы не сказал "конечно", см. мой ответ

IceCreamToucan 10.04.2019 22:53

Это интересно.

cropgen 10.04.2019 23:47

Другие вопросы по теме