我用R包检验了我的数据缺失值为0,但是运行代码还会报错有缺失。
检验代码:
> sum(is.na(Dat))
[1] 0
报错代码:
Error in `[<-.data.frame`(`*tmp*`, Dat[, i] >= outlier_limup | Dat[, i] <= : 执行数据框下标赋值时是不允许遗漏值的 In addition: Warning message: In as.numeric(as.character(Dat[, i])) : NAs introduced by coercion
整体代码:
setwd("E:\\Desktop\\课题新\\0.数据原表")
getwd()
#去除数据中每一列的异常值,只需要输入数据即可(修改dat的名称),需要确保输入的数据每一列都需要去除极值
Dat<-read.table("株高.csv")#dat为输入数据,即需要去除极端值的数据框或者矩阵
sum(is.na(Dat))
for (i in 1:ncol(Dat)) {
Dat[, i] <- as.numeric(as.character(Dat[, i]))#将目标列修改为数值型变量
outlier_limup <-
3 * IQR(Dat[, i], na.rm = TRUE) + quantile(Dat[, i], 3 / 4, na.rm = TRUE, names = FALSE)#极端值上界 :Q3+k(Q3-Q1)
outlier_limdown <-
quantile(Dat[, i], 1 / 4, na.rm = TRUE, names = FALSE) - 3 * IQR(Dat [, i], na.rm = TRUE) #3*极端值下界 :Q1-k(Q3-Q1)
Dat[Dat[, i] >= outlier_limup |
Dat[, i] <= outlier_limdown, i] = ""
}
2 回答
从你的代码和报错信息来看,问题可能出在这一行:
Dat[, i] <- as.numeric(as.character(Dat[, i]))#将目标列修改为数值型变量
这一行代码的目的是将数据框的列转换为数值型变量。但是,如果这一列中有不能转换为数值的元素(例如字符串或特殊字符),as.numeric()
函数会将这些元素转换为NA
,这就是你看到的警告信息:
In as.numeric(as.character(Dat[, i])) : NAs introduced by coercion
然后,当你试图在数据框中使用这些NA
值时,R会报错,因为数据框不允许使用NA
值。
你可以通过以下几种方式来解决这个问题:
在将数据框的列转换为数值型变量之前,检查这一列中是否有不能转换为数值的元素。如果有,你需要先处理这些元素,然后再进行转换。
使用na.omit()
或complete.cases()
函数来删除含有NA
值的行。
使用is.na()
函数和条件替换来将NA
值替换为其他值,例如0或平均值。
希望这些信息对你有所帮助!如果你还有其他问题,欢迎随时向我提问。
生信小学生