You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言`$<-.data.frame`报错求助:自定义数据分类函数运行异常

脏数据分类函数报错排查与解决

数据说明

我有一个4列的DataFrame,用于脏数据分类:

  • company_name:待分类的脏数据列
  • categories:目标分类标签列
  • search:用于匹配的关键词列
  • company_type:存储最终分类结果的列

原始数据示例

"company_name"           "categories"      "search"    "company_type"
   John landscaping        Landscaping       lawn          NA
   Brother Lawn care       Cleaning          clean         NA
    Top cleaning           Painting          paint         NA

期望输出结果

"company_name"           "categories"      "search"    "company_type"
   John landscaping        Landscaping       lawn          Landscaping 
   Brother Lawn care       Cleaning          clean         Landscaping 
    Top cleaning           Painting          paint         Cleaning

使用的代码及报错

我使用了一个自定义的categorizeDF函数进行分类,代码如下:

df$company_type <- NA

categorizeDF <- function(df, searchColName, searchList, catList, newColName="Category") {
  catDF <- data.frame(matrix(ncol=ncol(df), nrow=0))
  colnames(catDF) <- paste0(names(df))
  df$sequence <- seq(nrow(df))
  for (i in seq_along(searchList)) {
    rownames(df) <- NULL
    index <- grep(searchList[i], df[,which(colnames(df) == searchColName)], ignore.case=TRUE)
    tempDF <- df[index,]
    tempDF$newCol <- catList[i]
    catDF <- rbind(catDF, tempDF)
    df <- df[-index,]
  }
  if (nrow(df) > 0) {
    df$newCol <- "OTHER"
    catDF <- rbind(catDF, df)
  }
  catDF <- catDF[order(catDF$sequence),]
  catDF$sequence <- NULL
  rownames(catDF) <- NULL
  catDF$newCol <- as.factor(catDF$newCol)
  colnames(catDF)[which(colnames(catDF) == "newCol")] <- newColName
  catDF
}

sorted <- categorizeDF(df, "company_name", "search", "categories", "company_type")

运行后出现报错:

Error in `$<-.data.frame`(`*tmp*`, "newCol", value = "categories") : 
replacement has 1 row, data has 0
4.
stop(sprintf(ngettext(N, "replacement has %d row, data has %d", 
"replacement has %d rows, data has %d"), N, nrows), domain = NA)
3.
`$<-.data.frame`(`*tmp*`, "newCol", value = "categories")
2.
`$<-`(`*tmp*`, "newCol", value = "categories")
1.
categorizeDF(df, "company_name", "search", "categories", "company_type")

问题分析

报错的核心原因是函数参数传递错误:

  • categorizeDF的searchList参数需要传入关键词向量(即df$search),而不是列名字符串"search"
  • catList参数需要传入分类标签向量(即df$categories),而不是列名字符串"categories"

当传入字符串"search"时,seq_along(searchList)只会循环1次,grep("search", df$company_name)找不到匹配项,导致tempDF是空数据框。此时执行tempDF$newCol <- catList[i](即赋值"categories"),就会触发"替换值行数与数据框行数不匹配"的错误。

解决方法

修改函数调用语句,将searchList和catList替换为对应的列向量:

sorted <- categorizeDF(df, "company_name", df$search, df$categories, "company_type")

补充说明

  • 函数逻辑是按searchList的顺序依次匹配,匹配到的行会被从原数据中移除,后续不再参与匹配。比如示例中Brother Lawn care会先匹配到lawn关键词,因此分类为Landscaping,符合期望结果。
  • 如果有未匹配到的行,函数会自动将其分类为OTHER。

内容的提问来源于stack exchange,提问作者Linda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:18:19