R语言寻找data.frame缺失值位置
前言
R语言中并没有现成函数给出缺失值所在的位置,函数 is.na() 返回一个与原数据同型的逻辑“矩阵”(不一定是矩阵类型),现在我们自行编写一个函数用来寻找缺失值的具体位置,并在此基础上我们可以进一步画出缺失值的散点图,观察其分布等一系列操作。
代码及解释
na_position <- function(x){
# x <- as.matrix(x)
temp <- which(is.na(x))
if(setequal(temp, integer(0))){
return(temp)
}
temp_row <- dim(x)[1]
result <- data.frame(matrix(0, length(temp), 2))
colnames(result) <- c("Row", "Column")
for(i in 1:length(temp)){
result[i, 1] <- temp[i] %% temp_row
result[i, 2] <- temp[i] %/% temp_row + 1
}
return(result)
}
# x <- as.matrix(x)
这句话视情况看要不要注释掉,因为在接下来的操作中有些数据类型并不能顺利通过,所以需要先进行数据转换,这里转换成matrix
类型是因为matrix
的开销相对较小。- 还有一种情况算是前面的子情况,就是一个数据有双类型甚至是更多的类型,而在后面的代码运行中,使用了不好的类型。
- 假使没有缺失值,将返回
integer(0)
,这是个非常特殊的符号,代表啥也没有,空集,不能简单的与0做比较,integer(0) == 0
结果出来是FALSE
,而不会是TRUE
,因此需要函数setequal()
进行判断 - 关于
result[i, 1] <- temp[i] %% temp_row
和result[i, 2] <- temp[i] %/% temp_row + 1
,熟悉编程的语言可能已经想到了,实际上这与 矩阵、数据框等按列存放 有关,举个例子,
> A=matrix(1:12, 3, 4)
> A[2,3] <- NA
> A
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 NA 11
[3,] 3 6 9 12
> which(is.na(A))
[1] 8
这里为啥是8不是7呢?因为它是按列数的
- 最后,结果以 data.frame 形式返回
后续的一些观察与处理
result <- na_position(data)
# 获取缺失值所在的所有行
na_row <- unique(result[ ,1])
# 获取缺失值所在的所有列
na_col <- unique(result[ ,2])
# 直观观察缺失值的分布
plot(result)
# 缺失值是否会服从正态分布?
Shaporo.test (···)
# 缺失值是否服从均匀分布
chisq.test(···)