Мне нужно очистить беспорядочный фрейм данных, в основном используя str_replace_all
в рабочем процессе dplyr
. Я хотел бы обобщить свои исправления в таблице, включая количество каждой сделанной замены. В идеале str_replace_all
нужно было бы сделать это за один раз, потому что поиск этих опечаток (выполнение замен с помощью str_replace_all
) в огромном фрейме данных занимает довольно много времени.
См. пример:
my_str<-c('a', 'ca', 'c', 'bla')
my_df<-data.frame(my_str)
my_df
my_typo_corrections<- c(
'a'='b'
,'c'='d'
,'what so ever' = 'whatever')
my_corrected_df <- my_df%>%
dplyr::mutate(my_str = str_replace_all(my_str, my_typo_corrections))
my_corrected_df
Затем я хотел бы обобщить свои исправления в виде таблицы:
flextable((data.frame(my_typo_corrections) |> rownames_to_column("Typo"))%>%
rename(Correction = 'my_typo_corrections'))%>%
autofit()
Однако я хотел бы добавить в таблицу столбец, показывающий количество замен, сделанных для каждой определенной опечатки, например:
Обратите внимание: время обработки в некоторой степени имеет значение.
Или используйте пакет для сравнения двух кадров данных, например «по сравнению» или «по сравнению». Но это не совсем даст то, что вы хотите.
Есть ли отзывы/реакция на предоставленный ответ? Если это решит вашу проблему, пометьте его как принятый ответ, чтобы другие тоже могли извлечь из него пользу.
Вы могли бы сделать что-л. в этом направлении:
library(tidyverse)
my_df <- data.frame(my_str = c("a", "ca", "c", "bla"))
my_typo_corrections <- c("a" = "b",
"c" = "d",
"what so ever" = "whatever")
typo_counts <- names(my_typo_corrections)
names(typo_counts) <- typo_counts
my_df |>
mutate(my_str_new = str_replace_all(my_str, my_typo_corrections)) |>
rowwise() |>
mutate(counts = list(map(!!typo_counts,
~str_count(my_str, .x)))) |>
ungroup() |>
unnest_wider(counts)
Идея состоит в том, чтобы создать именованный вектор для подсчета случаев опечаток, а затем сопоставить каждую из них и создать соответствующий столбец в вашем фрейме данных.
Обратите внимание, что правильный счет для исправления «а» — 3, поскольку он встречается в первом, втором и последнем элементе («а» является частью «бла»).
Результат будет:
# A tibble: 4 × 5
my_str my_str_new a c `what so ever`
<chr> <chr> <int> <int> <int>
1 a b 1 0 0
2 ca db 1 1 0
3 c d 0 1 0
4 bla blb 1 0 0
откуда вы можете построить свой стол.
Спасибо за ваше предложение. Это работает, но требует довольно интенсивной обработки, поскольку str_replace_all
и str_count
выполняют одну и ту же длительную операцию поиска определенной строки в моем фрейме данных. Я бы предпочел избежать этого, потому что для моих данных требуются часы.
Бесплатного обеда не существует. Если вы хотите получить информацию о количестве замен, вам понадобятся оба. Могут быть более быстрые подходы, но пока вы заменяете определенные орфографические ошибки в векторе символов и если ваши данные большие, это занимает некоторое время. Если время выполнения является проблемой, предоставьте (случайный) пример ваших данных, который лучше представляет ваши данные (например, у вас есть строки длиной 1 миллион?).
Ну, еще я был бы не против бесплатного обеда. Можно было бы закодировать str_replace_and_count_all()
. Возможно, в стрингре 34.7.3.
Может быть, можно совместить с
str_count
(это всего лишь идея, не задумываясь об этом всерьез).