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

R Studio中K近邻(KNN)函数报错排查求助

R中knn函数报错排查与解决

报错信息

> knn(Taxi_train,Taxi_test,cl,k=100)
Error in knn(Taxi_train, Taxi_test, cl, k = 100) : 
  NA/NaN/Inf in foreign function call (arg 6)
In addition: Warning messages:
1: In knn(Taxi_train, Taxi_test, cl, k = 100) : NAs introduced by coercion
2: In knn(Taxi_train, Taxi_test, cl, k = 100) : NAs introduced by coercion

问题背景

调用knn函数时持续触发上述错误,已尝试将变量转为数值型但未解决,怀疑与cl因子参数有关,需定位并修复问题。

当前代码

date<-chicago_taxi$date
class(date)
Date <- as.Date(date)
class(Date)

Julian <- yday(Date)
class(Julian)
head(Julian)
chicago_taxi <- cbind(chicago_taxi,Julian)

chicago_taxi$seconds <- as.numeric(chicago_taxi$seconds)

set.seed(7777)
train_set <- sample(1:13081,10400,replace = FALSE)
Taxi_train <- chicago_taxi[train_set,]
Taxi_test <- chicago_taxi[-train_set,]

cl <- Taxi_train$payment_type

scale(chicago_taxi$miles)
scale(chicago_taxi$seconds)
scale(chicago_taxi$Julian)

knn(Taxi_train,Taxi_test,cl,k=100)

核心问题定位

  • 输入数据包含非数值列:knn要求训练/测试集仅包含数值型特征,但你直接传入了整个数据框子集,其中的date、payment_type等非数值列会在函数内部被强制转换,生成NA从而触发报错。
  • 标准化操作未生效:调用scale()后未将结果赋值回原数据框,等于没有执行标准化,会影响knn的距离计算逻辑。
  • 潜在缺失值风险:seconds、miles等列可能存在NA,或cl(标签列)有缺失值,这也会导致函数运行失败。

修正后的代码示例

# 加载class包(knn函数所属包)
library(class)

# 处理日期并提取儒略日
chicago_taxi$Julian <- yday(as.Date(chicago_taxi$date))

# 转换seconds为数值型
chicago_taxi$seconds <- as.numeric(chicago_taxi$seconds)

# 筛选仅用于建模的数值型特征列
feature_cols <- c("miles", "seconds", "Julian")
# 对特征执行标准化并覆盖原列
chicago_taxi[feature_cols] <- lapply(chicago_taxi[feature_cols], scale)

# 划分训练集和测试集
set.seed(7777)
train_set <- sample(1:nrow(chicago_taxi), 10400, replace = FALSE)
# 仅提取特征列作为knn输入
Taxi_train <- chicago_taxi[train_set, feature_cols]
Taxi_test <- chicago_taxi[-train_set, feature_cols]

# 提取并清洗标签列
cl <- chicago_taxi$payment_type[train_set]
# 移除标签为NA的样本
na_idx <- is.na(cl)
if(sum(na_idx) > 0) {
  Taxi_train <- Taxi_train[!na_idx, ]
  cl <- cl[!na_idx]
}
# 确保标签为因子类型
cl <- as.factor(cl)

# 调用knn函数
knn_result <- knn(Taxi_train, Taxi_test, cl, k = 100)

额外检查点

  • 检查特征列是否存在缺失值:sum(is.na(chicago_taxi[feature_cols])),若有缺失可使用na.omit()或均值/中位数填充。
  • 确认payment_type列无异常值(如空字符串),避免影响分类标签的有效性。

内容的提问来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:55:31