Добавить столбец категории в набор данных - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть такая таблица данных

+------------+-------+
|  Model     | Price | 
+------------+-------+
|  Apple-1   |   10  |
+------------+-------+
|  New Apple |   11  |
+------------+-------+
|  Orange    |   13  |
+------------+-------+
|  Orange2019|   15  |
+------------+-------+
|  Cat       |   19  |
+------------+-------+

Я хочу определить список тегов базовой модели, которые я хочу добавить в любую строку, соответствующую определенному условию / значению.Так, например, определил фрейм данных для тегирования следующим образом:

+------------+--------+
|  Model     |   Tag  | 
+------------+------ -+
|  Apple-1   |   A    |
+------------+------ -+
|  New Apple |   A    |
+------------+------ -+
|  Orange    |   B    |
+------------+------ -+
|  Cat       |   B    |
+------------+--------+

Я хотел бы найти способ получить такие результаты:

+------------+-------+--------+
|  Model     | Price |  Tag   |
+------------+-------+--------+
|  Apple-1   |   10  |   A    |
+------------+-------+--------|
|  New Apple |   11  |   A    |
+------------+-------+--------|
|  Orange    |   13  |   B    |
+------------+-------+--------|
|  Orange2019|   15  |   B    |
+------------+-------+--------|
|  Cat       |   19  |   B    |
+------------+-------+--------|

Я не против использоватьтаблица для управления данными тегов, и я знаю, что мог бы написать очень «ad-hoc» оператор mutate для достижения желаемых результатов, просто задаваясь вопросом, есть ли более элегантный способ тегирования строки, основанный на сопоставлении с шаблоном.

1 Ответ

0 голосов
/ 20 февраля 2019

Одна идея состоит в том, чтобы использовать расстояния Левенштейна для объединения слов, которые у вас есть.Вам нужно будет предоставить несколько кластеров.Когда у вас есть эти кластеры, просто добавьте номер каждого из них в качестве тега категории к вашей таблице.Проверьте этот ответ, который входит в детали кластеризации расстояния Левенштейна. Кластеризация текста с расстояниями Левенштейна

edit

Мне кажется, я совершенно неправильно понял ваш вопрос ... попробуйте это

df=data.frame("Model"=c("Apple-1","New Apple","Organe","Orange2019","Cat"),
              "Price"=c(10,11,13,15,19),stringsAsFactors = FALSE)
tags=data.frame("Model"=c("Apple-1","New Apple","Orange","Cat"),
                "Tag"=c("A","A","B","B"),stringsAsFactors = FALSE)


df%>%rowwise()%>%mutate(Tag=if_else(!is.na(tags$Tag[which(!is.na(str_extract(Model,tags$Model)))[1]]),
                                    tags$Tag[which(!is.na(str_extract(Model,tags$Model)))[1]],false="None"))

  Model      Price Tag  
  <chr>      <dbl> <chr>
1 Apple-1       10 A    
2 New Apple     11 A    
3 Organe        13 None 
4 Orange2019    15 B    
5 Cat           19 B 

Я действительно изменил Orange на Organe, чтобы вы видели, что происходит, если не найдено совпадений (none возвращается)

...