使用arules包转换transactions时出错:需先离散化非逻辑/因子列
解决
arules中数据转transactions类型的报错问题 你运行这段R代码时遇到了转换失败的错误:
library(arules) library(rattle) data <- read.csv('R/347_347.csv', header = TRUE, stringsAsFactors = TRUE) Data <- data[c(3:23)] # 报错出现在后续转换步骤 trans <- as(Data, "transactions")
对应的报错信息是:
Error in asMethod(object) : 第1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21列不是逻辑型或因子型,请先离散化这些列。
报错原因
arules包要求转换为transactions类型的数据,每一列必须是逻辑型(logical)或者因子型(factor)——而你提取的Data数据框里,这些列都是数值型(numeric)的,不符合转换要求,所以才会触发报错。
具体解决方法
根据你的数据情况,你可以选择下面几种方式处理:
1. 手动自定义离散化(适合需要精准控制分箱规则的场景)
用cut()函数把数值列分成指定区间,转成因子型。比如把每列分成“低/中/高”三个区间:
# 批量处理所有数值列 Data <- as.data.frame(lapply(Data, function(col) { if (is.numeric(col)) { # 这里的breaks可以自定义,比如换成具体数值c(0, 50, 100, Inf) cut(col, breaks = 3, labels = c("低", "中", "高")) } else { col # 非数值列保持原样 } }))
2. 用arules自带工具自动离散化(更省心的自动化方式)
arules包里的discretize()函数支持自动分箱,默认是等频分箱(把数据分成频数相近的组),也可以指定等宽分箱:
library(arules) # 自动处理所有数值列 Data <- as.data.frame(lapply(Data, function(col) { if (is.numeric(col)) { # 默认等频分箱,想换等宽的话加method = "interval" discretize(col) } else { col } }))
3. 如果是0/1数值列,直接转逻辑型
如果你的列是0(代表无)和1(代表有)的数值,直接转成逻辑型就可以:
Data <- as.data.frame(lapply(Data, function(col) { if (is.numeric(col)) { as.logical(col) } else { col } }))
最后验证并转换
处理完列类型后,再运行转换代码就没问题了:
trans <- as(Data, "transactions")
另外,你可以先用str(Data)查看每一列的类型,确认所有需要转换的列都处理好了~
内容的提问来源于stack exchange,提问作者Arthur Tang
相关产品推荐
相关产品推荐

