我是R的新手并尝试编写脚本以将产品类别分配到产品标题列表中。我有一个查找表,它关联对应于特定产品类别的关键字。 例如
mouse <- c("mouse","keyboard")
laptop <- c("laptop","notebook","thinkpads")
tv <- c("tv","television")
我已将其合并到列表中
lookups <- list(mouse,laptop,tv)
我的NAs数据集如下所示:
NAs <- read.csv(somefile.csv)
brand product_title category
Asus Asus Zenphone 2 ZE551ML other
Beko Frost Free Combi Fridge other
Beko Frost Free Combi Fridge other
Beko EcoSmart American Style other
Beko Cookmaster other
我想要的是在product_title中进行搜索并根据我的查找列表分配一个类别。 到目前为止,我已经编写了一个基于列表进行搜索的功能:
assigncategory <- function(product_title) {
for(j in 1:length(lookups)){
if (length(grep(paste(lookups[j], collapse="|"),product_title,value=T,ignore.case=T))>0){
return (colnames(lookups[j])
} else {
return ("Other")
}
}
}
现在我循环使用此函数将正确的类别分配给我的数据集:
for (i in 1:nrow(NAs)) {
if(NAs$category[i]=="Other"){
NAs$category[i] <- assigncategory(NAs[i,"product_title"])
} else {
NAs$category[i] <- NAs$category[i]
}
}
table(NAs$category)
结果仍然给了我这个,并没有为我的任何产品分配任何类别。
> table(NAs$category)
Other
2510
请帮助我理解我做错了什么。
答案 0 :(得分:0)
问题在于:
assigncategory <- function(product_title) {
for(j in 1:length(lookups)){
if (length(grep(paste(lookups[j], collapse="|"),product_title,value=T,ignore.case=T))>0){
return (colnames(lookups[j])
} else {
return ("Other")
}
}
}
此循环检查lookups
中的第一个向量,如果找到该项,则返回NULL
,因为向量的colnames
将始终为NULL。如果找不到该项,则返回“其他”,而不检查lookups
的任何其他成员。
以下是更正后的版本:
assigncategory <- function(product_title) {
for(j in 1:length(lookups)){
if (grepl(paste(lookups[[j]], collapse="|"),product_title,ignore.case=TRUE)){
return (names(lookups)[j])
}
}
return("Other")
}
您还需要确保列表名称为:
lookups <- list(mouse = mouse, laptop = laptop, tv = tv)