R: использование sapply или str_replace_all вместо FindReplace - PullRequest
0 голосов
/ 04 августа 2020

Пример фрейма данных:

words <- c('Nothing', 'no thing', 'nada', 'nuthin', 'not a thing', 'nothing', 'nothing', 'Nothing', 'nil')
number <- c(1:9)
df <- data.frame(words, number)

В этом df мне нужно заменить все слова, которые эквивалентны «ничему», на «ничего». В этом примере df это все слова, но на самом деле df содержит много слов, которые не следует изменять. У меня есть текстовый файл со списком слов, которые следует изменить, и я прочитал этот файл с помощью read_delim. После чтения файла 'changes' отображается как 'list' после его выполнения через typeof () и как "spec_tbl_df" "tbl_df" "tbl" "data.frame" после его выполнения через class ().

Мне удалось заставить FindReplace работать только из пакета DataCombine. Сначала я создал столбец замены в «изменениях», а затем прогнал его через FindReplace.

changes <- mutate(changes, Replacement='Nothing')
df <- FindReplace(df, 'words', changes, from='words', to='Replacement', exact=TRUE, vector=FALSE)

Результаты - это то, что я хочу.

words    number
Nothing  1
Nothing  2
Nothing  3
Nothing  4
Nothing  5
Nothing  6
Nothing  7
Nothing  8
Nothing  9

Но я думаю, что должен быть способ запустите al oop поверх 'changes' и используйте для этого sapply или str_replace_all. Но я не мог заставить их работать. Я продолжал получать сообщение об ошибке: Ошибка в UseMethod ("тип"): нет применимого метода для "типа", примененного к объекту класса "c ('tbl_df', 'tbl', 'data.frame')". Я хотел бы знать, как заставить работать эти два варианта, если это возможно. Также мы будем признательны за ваши мысли о пакете DataCombine. Раньше не встречал.

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Вы можете попробовать этот подход

df2 <- df %>% 
  mutate(words = str_replace_all(words, regex(" "), "")) %>% 
  mutate(words =  str_to_title(words, locale = "en")) %>% 
  mutate(words =  str_replace_all(words, regex("^Na.*|^Nu.*|^Nil.*|^Nota.*"), "Nothing"))
df2
#     words   number
# 1 Nothing      1
# 2 Nothing      2
# 3 Nothing      3
# 4 Nothing      4
# 5 Nothing      5
# 6 Nothing      6
# 7 Nothing      7
# 8 Nothing      8
# 9 Nothing      9
0 голосов
/ 04 августа 2020

два способа, которыми я это делаю, - это либо вложенные операторы ifelse, либо таблица замен, а затем left_join ().

пример вложенного ifelse: вы можете l oop это столько раз, сколько необходимо .

    df %>%
       mutate(col_with_text = ifelse(col_with_text == "Nothing", "None",
                                    ifelse(col_with_text == "nada", "None", NA)) 

пример таблицы и левого соединения:

table_for_join <- data.frame(col_with_names = c('Nothing', 'no thing', 'nada', 'nuthin', 'not a thing', 'nothing', 'nothing', 'Nothing', 'nil'),
                             new_values = "None") # just made this one all the same for simplicity, but you can define this table however makes sense 

df %>%
  mutate(new_col = left_join(., table_for_join))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...