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
相关产品推荐
相关产品推荐

