R(函数循环)循环使用函数(带列表的另一个循环)并使用函数循环中的正确关键字为数据帧赋值

时间:2015-08-03 12:49:43

标签: r function loops

我是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 

请帮助我理解我做错了什么。

1 个答案:

答案 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)