在R中映射数据集名称遇错误,求聚类分析代码修复方案
解决iris聚类分析中的Map函数错误
我来帮你搞定这个代码报错的问题~这个错误的核心原因其实很清晰:你传给Map的ds参数是字符串(比如"iris0"),而不是实际的数据框对象。R的$和子集操作符[,]只能用于数据框或列表,用在原子向量(字符串)上自然会报错。下面是具体的修复方案和解释:
错误根源拆解
你的tests$DS列存储的是数据框的名称字符串("iris0"、"iris1"、"iris2"),当Map迭代这些值时,ds参数拿到的是单个字符串,不是你定义的iris0这类数据框。所以执行ds$Species时,R会报错说“$操作符对原子向量无效”——因为字符串是原子向量的一种,不支持数据框的操作。
修复方案1:用get()函数获取数据框
get()函数可以根据字符串名称,从当前环境中取出对应的对象。我们只需要在Map的匿名函数里,先把字符串转换成实际的数据框即可:
# 先修正acc函数的语法(用换行或分号分隔语句) acc <- function(x){ first = sum(x) second = sum(x^2) return(list(First=first, Second=second)) } # 生成超参数组合时,建议关闭因子转换,避免后续麻烦 tests <- expand.grid( Clustering_Algorithm = c("ward.D","ward.D2","single","complete","average","mcquitty","median","centroid"), DS = c("iris0","iris1","iris2"), stringsAsFactors = FALSE ) # 定义处理后的数据集 iris0 <- iris iris1 <- cbind(log(iris[,1:4]), iris[5]) iris2 <- cbind(sqrt(iris[,1:4]), iris[5]) # 修改Map中的函数,用get()获取实际数据框 Table <- Map(function(alg, ds_name){ # 根据字符串名称取出数据框 ds <- get(ds_name) # 执行聚类和交叉表计算 clusters <- cutree(hclust(dist(ds[,1:4]), method = alg), 3) cross_tab <- table(ds$Species, clusters) # 调用acc函数 acc(cross_tab) }, tests$Clustering_Algorithm, tests$DS)
修复方案2:用列表管理数据集(更规范)
如果不想依赖环境中的零散对象,更推荐把所有数据集放到一个列表里,这样更安全也更易维护:
acc <- function(x){ first = sum(x) second = sum(x^2) return(list(First=first, Second=second)) } # 把所有数据集放到一个列表中,名称对应tests里的DS值 ds_list <- list( iris0 = iris, iris1 = cbind(log(iris[,1:4]), iris[5]), iris2 = cbind(sqrt(iris[,1:4]), iris[5]) ) # 生成超参数组合时,直接用列表的名称 tests <- expand.grid( Clustering_Algorithm = c("ward.D","ward.D2","single","complete","average","mcquitty","median","centroid"), DS = names(ds_list), stringsAsFactors = FALSE ) # Map中直接从列表提取数据框 Table <- Map(function(alg, ds_name){ ds <- ds_list[[ds_name]] clusters <- cutree(hclust(dist(ds[,1:4]), method = alg), 3) cross_tab <- table(ds$Species, clusters) acc(cross_tab) }, tests$Clustering_Algorithm, tests$DS)
为什么之前的尝试没用?
你之前尝试as.character(tests[[2]]),只是把因子转成了字符串,但本质还是字符串,不是数据框;用ds %>% .[,"Species"]也一样,因为ds是字符串,管道操作后还是字符串,自然会报“维度数错误”——字符串是一维的,没有列的概念。
内容的提问来源于stack exchange,提问作者Mobeus Zoom
相关产品推荐
相关产品推荐

