将类别列添加到数据集
Add category column to a data set
我有一个这样的数据table
+------------+-------+
| Model | Price |
+------------+-------+
| Apple-1 | 10 |
+------------+-------+
| New Apple | 11 |
+------------+-------+
| Orange | 13 |
+------------+-------+
| Orange2019| 15 |
+------------+-------+
| Cat | 19 |
+------------+-------+
我想定义一个基本模型标签列表,我想将其添加到与某些 condition/value 匹配的任何单行中。因此,例如为这样的标记定义了一个数据框
+------------+--------+
| 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 |
+------------+-------+--------|
我不介意使用 table 来管理标记数据,我知道我可以编写非常 "ad-hoc" 的 mutate 语句来实现我想要的结果,只是想知道如果有更优雅的方法来根据模式匹配标记字符串。
一个想法是使用 Levenshtein 距离来聚类您拥有的单词。您需要提供多个集群。拥有这些集群后,只需将每个集群的编号作为类别标签添加到您的 table。查看此答案,其中详细介绍了 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
)
我有一个这样的数据table
+------------+-------+
| Model | Price |
+------------+-------+
| Apple-1 | 10 |
+------------+-------+
| New Apple | 11 |
+------------+-------+
| Orange | 13 |
+------------+-------+
| Orange2019| 15 |
+------------+-------+
| Cat | 19 |
+------------+-------+
我想定义一个基本模型标签列表,我想将其添加到与某些 condition/value 匹配的任何单行中。因此,例如为这样的标记定义了一个数据框
+------------+--------+
| 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 |
+------------+-------+--------|
我不介意使用 table 来管理标记数据,我知道我可以编写非常 "ad-hoc" 的 mutate 语句来实现我想要的结果,只是想知道如果有更优雅的方法来根据模式匹配标记字符串。
一个想法是使用 Levenshtein 距离来聚类您拥有的单词。您需要提供多个集群。拥有这些集群后,只需将每个集群的编号作为类别标签添加到您的 table。查看此答案,其中详细介绍了 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
)