R语言kknn训练结果调用dplyr的group_by函数报错问题求助
问题根源
R中的矩阵要求所有元素的数据类型必须统一,你初始化的results是数组(矩阵结构),第4列存入了字符串类型的内核名称,因此整个矩阵会被自动强制转换为字符型,哪怕前三列存储的是数值内容,也会被同步转为字符格式,这就是所有列typeof返回character的原因。
你将矩阵转为数据框时,列的字符类型会被保留,因此调用mean计算时会触发非数值报错。
解决方案
方案1:转换数据框后重置列类型
将矩阵转为数据框后,手动把数值列转为双精度类型即可:
# 转换为数据框 results_df <- as.data.frame(results, stringsAsFactors = FALSE) # 重置前三列的数据类型为数值型 results_df <- transform( results_df, K = as.numeric(K), MSE = as.numeric(MSE), MAE = as.numeric(MAE) )
转换完成后即可正常使用dplyr操作:
library(dplyr) results_df %>% group_by(K) %>% summarize(mean_val = mean(MSE))
方案2:初始化时直接使用数据框存储结果(更推荐)
从根源避免矩阵的类型强制转换问题,直接初始化数据框存储结果:
kernel <- c('gaussian', 'optimal', 'rectangular', 'biweight', 'cos', 'inv', 'triangular', 'epanechnikov') # 初始化空数据框,提前定义每列的类型 results_df <- data.frame( K = integer(), MSE = double(), MAE = double(), KERNEL = character() ) # 循环写入结果 for (i in kernel) { model <- train.kknn(R1~., data, kmax = 50, kernel = i) temp_df <- data.frame( K = 1:50, MSE = model$MEAN.SQU, MAE = model$MEAN.ABS, KERNEL = i ) results_df <- rbind(results_df, temp_df) }
该方法生成的结果直接为正确的列类型,无需后续额外转换。
内容的提问来源于stack exchange,提问作者Jonathan Bechtel
相关产品推荐
相关产品推荐

