RStudio推文apriori关联分析调用read.transactions处理百万行数据报错
错误根本原因
arules包的read.transactions函数在将原始数据转换为交易对象时,底层会生成稀疏矩阵类ngCMatrix,该类要求每一列对应的行索引必须按升序排列。百万级数据量下,单条交易中存在重复项、项顺序混乱的概率大幅提升,你当前设置rm.duplicates=FALSE会保留单条交易内的重复词汇,直接导致索引重复插入,触发排序校验报错,小批量数据时重复项出现概率低因此未触发错误。
解决方案
方案1:修改读取参数(优先尝试)
将rm.duplicates参数设置为TRUE,读取时自动移除单条交易内的重复项,绝大多数场景下可直接解决问题:
TweetTrans <- read.transactions("../input/tweets/output.csv", rm.duplicates=TRUE, format = "basket", sep = ",", encoding = "UTF-8")
关联规则挖掘本身不关心单条交易内项的出现次数,只关心项是否出现,移除重复项不会影响最终挖掘结果。
方案2:分块读取合并(参数修改无效时使用)
如果全量读取依然报错,可拆分数据分块处理后合并交易对象:
library(arules) # 按行读取全量文件 all_lines <- readLines("../input/tweets/output.csv", encoding = "UTF-8") # 每10万行拆分为一个块 chunk_size <- 100000 chunks <- split(all_lines, ceiling(seq_along(all_lines)/chunk_size)) # 逐块处理并合并 trans_list <- list() for(i in seq_along(chunks)){ # 临时写入块文件 temp_file <- tempfile() writeLines(chunks[[i]], temp_file) # 读取块为交易对象 trans_chunk <- read.transactions(temp_file, rm.duplicates = TRUE, format = "basket", sep = ",", encoding = "UTF-8") trans_list[[i]] <- trans_chunk unlink(temp_file) } # 合并所有块的交易对象 TweetTrans <- do.call(c, trans_list)
方案3:预处理后转换(兜底方案)
如果分块读取依然报错,可先将数据预处理为标准交易列表再转换:
library(arules) # 读取原始数据为列表 raw_trans <- strsplit(readLines("../input/tweets/output.csv", encoding = "UTF-8"), ",") # 对每条交易去重、排序 clean_trans <- lapply(raw_trans, function(x){ unique(sort(trimws(x))) }) # 转换为交易对象 TweetTrans <- as(clean_trans, "transactions")
内容的提问来源于stack exchange,提问作者S.SavaS
相关产品推荐
相关产品推荐

