将类别列添加到数据集

时间:2019-02-20 16:20:22

标签: r tagging

我有一个像这样的数据表

+------------+-------+
|  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    |
+------------+-------+--------|

我不介意使用表格来管理标记数据,而且我知道我可以编写非常特殊的mutate语句来实现所需的结果,只是想知道是否还有更优雅的方法根据模式匹配标记字符串。

1 个答案:

答案 0 :(得分:0)

一个想法是使用Levenshtein距离对您所拥有的单词进行聚类。您将需要提供许多集群。一旦有了这个集群,只需将每个集群的数量作为类别标记添加到表中。看看这个答案,它详细介绍了Levenshtein距离聚类。 Text clustering with Levenshtein distances

修改

我想我完全误解了你的问题...试试这个

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)会发生什么情况

相关问题