Как я могу найти и заменить значения между двумя фреймами данных в R - PullRequest
1 голос
/ 07 января 2020

У меня есть фрейм данных из tidytext, который содержит отдельные слова из некоторых комментариев, полученных в ответах на опрос. В нем всего 500 000 строк. Будучи свободным ответом, он пронизан опечатками. Использование textclean :: replace_misspellings позаботилось о почти 13 000 слов с орфографическими ошибками, но я по-прежнему оставил ~ 700 уникальных орфографических ошибок, которые я определил вручную.

Теперь у меня есть вторая таблица с двумя столбцами, первая - орфографическая, а вторая - это исправление.

Например

allComments <- data.frame("Number" = 1:5, "Word" = c("organization","orginization", "oragnization", "help", "hlp"))
misspellings <- data.frame("Wrong" = c("orginization", "oragnization", "hlp"), "Right" = c("organization", "organization", "help"))

Как мне заменить все значения allComments$word, которые соответствуют misspellings$wrong, на misspellings$right?

Я чувствую как это, вероятно, довольно основа c и мое невежество R показывает ....

Ответы [ 4 ]

5 голосов
/ 07 января 2020

Вы можете использовать match, чтобы найти индекс для слов из allComments$Word в misspellings$Wrong, а затем использовать этот индекс для их поднабора.

tt <- match(allComments$Word, misspellings$Wrong)
allComments$Word[!is.na(tt)]  <- misspellings$Right[tt[!is.na(tt)]]
allComments
#  Number         Word
#1      1 organization
#2      2 organization
#3      3 organization
#4      4         help
#5      5         help

В случае, если правильное слово еще не в allComments$Word приведите его к character:

allComments$Word <- as.character(allComments$Word)
3 голосов
/ 07 января 2020

Вот еще одно базовое решение R, использующее replace()

allComments <- within(allComments, 
                      Word <- replace(Word,
                                      which(!is.na(match(Word,misspellings$Wrong))),
                                      na.omit(misspellings$Right[match(Word,misspellings$Wrong)])))

, такое что

> allComments
  Number         Word
1      1 organization
2      2 organization
3      3 organization
4      4         help
5      5         help
2 голосов
/ 07 января 2020
allComments %>%
  left_join(misspellings, by = c("Word" = "Wrong")) %>%
  mutate(Word = coalesce(as.character(Right), Word))
#   Number         Word        Right
# 1      1 organization         <NA>
# 2      2 organization organization
# 3      3 organization organization
# 4      4         help         <NA>
# 5      5         help         help

Конечно, вы можете удалить столбец Right, когда закончите.

1 голос
/ 07 января 2020

Вот решение data.table:

library(data.table)
setDT(allComments)
setDT(misspellings)
df <- merge.data.table(allComments, misspellings, all.x = T, by.x = "Word", by.y = "Wrong")
df <- df[!(is.na(Right)), Word := Right]
df <- df[, c("Number", "Word")]
df <- df[order(Number)]
df

#    Number         Word
#1:      1  organization
#2:      2  organization
#3:      3  organization
#4:      4          help
#5:      5          help
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...