R语言e1071包cmeans运行NAs introduced by coercion报错排查
错误原因
- 传入
cmeans()的输入数据不符合要求:模糊C均值聚类仅支持全数值类型的输入,代码中仅删除了SNAMA.SMA列,但数据集中存储学校名称的文本列NAMA.SMA仍留在特征集中。该列为字符串类型,函数运行时会尝试将其强制转换为数值,转换失败就会生成NA值,对应提示中的NAs introduced by coercion警告;当NA值传入底层的C语言计算接口时,就会触发NA/NaN/Inf in foreign function call (arg 1)的报错。 - 代码存在拼写笔误:定义的特征数据框名为
data.features,但中间写了View(dataku.features),dataku.features是不存在的对象,这行本身也会触发运行错误。 - 若删除所有非数值列后仍报错,需检查数值列中是否存在原生缺失值、无穷值,这类异常值同样会导致函数运行中断。
修正方案
按照以下逻辑调整代码即可正常运行:
- 剔除特征集中所有非数值的文本/因子列,不要把名称类标识列传入聚类函数
- 修正拼写笔误
- 聚类前检查并处理数值列中的缺失值
- 绘图时不要把非数值的名称列传入
plot()的散点矩阵参数
修正后的可运行代码:
# 读取数据 data <- read.delim(file.choose(), header = T) data.features <- data # 修正:删除实际存在的名称列NAMA.SMA,而非拼写错误的SNAMA.SMA data.features$NAMA.SMA <- NULL # 检查列类型,确认所有剩余列均为数值型 str(data.features) # 处理数值列中可能存在的缺失值,这里直接删除含缺失值的行,也可根据需求选择填充方式 data.features <- na.omit(data.features) # 加载包运行模糊C均值聚类 library(e1071) result <- cmeans(data.features, 3, 20, verbose = TRUE, method = "cmeans", m = 2) print(result) # 绘图时仅传入数值特征列,避免文本列干扰绘图 plot(data[c("SISWA","GURU","KARYAWAN","PEKERJA","PENGAWAS")], col = result$cluster)
内容的提问来源于stack exchange,提问作者Reni Setyaningsih
相关产品推荐
相关产品推荐

