Я пытаюсь удалить некоторый шаблон (to_remove
) из другого строкового столбца (entry
) внутри mutate()
.
Проблема в том, что столбцы строки и шаблона содержат пустые строки. Таким образом, использование некоторых векторизованных функций, таких как stringr::str_remove()
, приведет к некоторым предупреждениям и значительно замедлит процесс.
Я заметил, что без пустых строк и шаблонов (т.е. вы заменяете их некоторыми значениями) для заполнения примерно 1e5 строк записей потребуется менее 1 секунды. Однако с предупреждениями это займет более 10 секунд.
Мне интересно, могу ли я каким-либо образом использовать stringr::str_remove()
внутри mutate()
, но пропуская эти пустые строки, чтобы я все еще мог получить преимущество в скорости от векторизации.
Обратите внимание, что я также могу использовать dplyr::rowwise()
+ gsub()
, но rowwise()
также сильно замедляет работу :(
Пример кода:
library(tidyverse)
library(stringr)
set.seed(123)
temp <- data.frame(
entry = c('A12','JW13','C','')
,to_remove = c('A','W','','D')
) %>%
sample_n(1e5,replace = T)
temp <- temp %>%
mutate(
removed = str_remove(entry,to_remove)
)
Попробуйте заменить пустые значения на NA
:
library(dplyr)
library(stringr)
temp %>%
mutate(to_remove = na_if (to_remove, ''),
removed = str_remove(entry,to_remove))
Мы можем
library(dplyr)
library(stringr)
temp %>%
mutate(removed = str_remove(entry, replace(to_remove, to_remove == "", NA)))