Изменение столбца с помощью сопоставления текста - PullRequest
0 голосов
/ 31 января 2020

У меня есть символьный вектор во фрейме данных с> 500 значениями - около 50 из них являются множественными итерациями одной и той же вещи (ie "Тюльпан" и "Маленький тюльпан" и "Тюльпан" Тюльпан - Fre sh Вырежьте », а затем аналогично« Роза »,« Мини-роза »,« Восхождение на розу ».

Я хочу преобразовать это в другой столбец, где я указываю, что каждый из них становится« Тюльпан »или« Роза »или поддерживает его предыдущее значение, если оно не совпадает.

Например,

  1. Мини-роза
  2. Пион ie
  3. Тюльпан
  4. Красная роза
  5. Маленький тюльпан
  6. Тюльпан - Фре sh Собран
  7. Фиолетовый
  8. Нарцисс
  9. Розовые тюльпаны
  10. Розы

Должны стать ... 1. Роза 2. Пион ie 3. Тюльпан 4. Роза 5. Тюльпан 6. Тюльпан 7. Фиалка 8. Нарцисс 9. Тюльпаны 10. Rose

Я попробовал это множество способов, используя mutate, lapply и grep и различные итерации, но безуспешно. Любой совет? Кажется, что-то из базовых c сделать в R bu t Я изо всех сил пытался найти решение

1 Ответ

0 голосов
/ 02 февраля 2020

Это простой случай сопоставления строки / регулярного выражения и назначения новой (или старой переменной) с if_else или dplyr::case_when. Вот один из лучших способов сделать это:

library(tidyverse)
library(stringi)

flower_data = tibble(flower = c("Type of Rose", "Type of Tulip", "Other Flower")) 
flower_data %>%
  mutate(new_flower = case_when(
    stringi::stri_detect_regex(flower, "[Rr]ose") ~ "Rose",
    stringi::stri_detect_regex(flower, "[Tt]ulip") ~ "Tulip",
    TRUE ~ flower
  ))

Мне нравится реализация stringi, потому что я нашел ее намного быстрее, чем stringr::str_detect и case_when по сравнению с вложенными if_else операторами. из-за читабельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...