You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:57:02