R语言hclust()报错:外部函数调用含NA/NaN/Inf问题求助
解决R语言hclust聚类时的NA错误问题
嘿,作为R新手遇到这种报错确实头疼,我来帮你拆解问题根源和解决办法:
错误根源分析
你代码里的核心问题出在hclust的members参数上:
members = clustdata[,1]
这个参数要求传入数值型向量(用来指定每个观测的权重/重复次数),但你传的是投手姓名(字符型数据)。R在尝试把字符转成数值时会生成NA,这就是你看到的"NAs introduced by coercion"的原因,而这些NA又导致hclust调用底层函数时触发了"NA/NaN/Inf in foreign function call (arg 7)"的错误。
具体解决步骤
1. 修正hclust的members参数
如果你不需要给观测设置权重(大部分聚类场景不需要),直接删掉这个参数即可,因为members是可选参数,默认每个观测权重为1:
hc_1 = hclust(d, method = "single")
如果你确实需要设置权重(比如用投手的出场次数作为权重),那你得先统计出场次数生成数值型向量:
# 统计每个投手的出场次数 pitcher_counts = aggregate(v_score ~ h_starting_pitcher_name, data8, length) # 确保次数数据和聚类数据的顺序一致(aggregate会按分组名排序,这里可以直接合并) clustdata = merge(clustdata, pitcher_counts, by.x = "scoreagg.h_starting_pitcher_name", by.y = "h_starting_pitcher_name") # 用出场次数作为members参数传入 hc_1 = hclust(d, method = "single", members = clustdata$v_score.y)
2. 验证聚类数据的数值类型
虽然你预览了clustdata,但还是要确认第2-9列都是数值型,避免隐藏的字符数据导致转矩阵时出错:
# 查看列类型 str(clustdata[,2:9]) # 如果有非数值列,强制转换 clustdata[,2:9] = lapply(clustdata[,2:9], as.numeric) # 检查是否还有NA sum(is.na(clustdata[,2:9]))
3. 简化数据聚合代码(可选,但更高效)
你现在用了多个aggregate,其实可以一次性聚合所有变量,避免重复代码和顺序不一致的问题:
# 一次性按投手姓名聚合所有需要的变量,求均值 clustdata = aggregate( cbind(v_score, v_hits, v_doubles, v_triples, v_homeruns, v_hit_by_pitch, v_walks, v_strikeouts) ~ h_starting_pitcher_name, data = data8, FUN = mean ) # 此时clustdata第一列是投手名,后面全是均值列,结构更清晰
内容的提问来源于stack exchange,提问作者imbacon
相关产品推荐
相关产品推荐

