R语言应用K-means聚类搜寻最优K时出现NA类报错的咨询
报错根因定位
你遇到的两类报错是完全连锁的同一问题:
- 数据集第一列
gene为存储基因名称的文本字符型字段,不属于可参与距离计算的数值特征 - 直接将包含文本列的完整数据框传入
kmeans()时,R会强制将整个数据框转换为双精度浮点型做底层计算,文本列无法完成数值转换会批量生成NA值 - K-means的底层C实现不接受包含NA、NaN、无穷值的输入矩阵,因此最终抛出外函数调用的执行错误
分步解决操作
- 第一步:剔除聚类输入中的非数值标识列
直接保留从第二列开始的所有基因表达数值列,不要将第一列的基因名称作为算法输入:# 移除第一列文本列,提取纯数值型的聚类输入数据 nci_cluster_input <- nci[, -1] - 第二步:提前校验输入数据的合法性
执行以下代码排查残留的异常值,避免后续再次触发同类报错:
如果校验发现仍有残留异常值,可根据分析需求选择剔除对应行/列,或用列均值、中位数完成缺失值填充。# 确认所有列均为数值类型 str(nci_cluster_input) # 统计是否存在缺失值、非数、无穷值 sum(is.na(nci_cluster_input)) sum(is.nan(as.matrix(nci_cluster_input))) sum(is.infinite(as.matrix(nci_cluster_input))) - 第三步:重新调用K-means完成聚类计算
将处理好的纯数值矩阵传入算法即可正常运行:# 指定聚类中心数量为10完成计算 kmeans_res <- kmeans(nci_cluster_input, centers = 10)
实操补充提示
- K-means基于欧氏距离做计算,对特征量纲敏感,如果输入的基因表达数据未做标准化,建议计算前对每列特征做Z-score标准化,避免量纲差异扭曲距离计算结果
- 注意数据集的维度匹配:当前数据集每行对应1个基因、每列对应1个肿瘤样本,如果你的聚类目标是对肿瘤样本分簇,需要将数值矩阵做转置(即传入
t(nci_cluster_input))再运行K-means,否则算法会将数千个基因作为样本点聚类,和预设的分析目标错位 - 后续搜寻最优K值时,可结合簇内平方和的肘部法则、轮廓系数做可视化判断,不需要手动逐次试错
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

