【转】删除只含有NA的行或者列
很奇怪,R里面对missing values(NAs)的处理非常的保守。要么原封不同,要么连带着这一行的所有其他值全部删除。比如
首先随便构造一个全是数值的NAs的data.frame
> student <- data.frame(name = c("aa","bb",NA,"DD",NA),
+ age=c("10",NA,"13","9",NA),
+ class=c("6","6","8","6",NA),
+ gender =c("m",NA,NA,NA,NA))
> student
name age class gender
1 aa 10 6 m
2 bb <NA> 6 <NA>
3 <NA> 13 8 <NA>
4 DD 9 6 <NA>
5 <NA> <NA> <NA> <NA>
通常的去除NAs的方法就是使用na.omit(),得到的结果像这样:
> na.omit(student)
name age class gender
1 aa 10 6 m
显然有时候我们并不想要丢失2-3行。
2 bb <NA> 6 <NA>
3 <NA> 13 8 <NA>
我没有找到一个合适的函数能够只删除其中全都是NAs的行或者列。这里写了一个函数,能初步达到效果,但是实现方式显然不是那么的优雅。
> drop_Nas <- function (data,dim){
+ if (dim == 2){
+ na_flag <- apply(!is.na(data),2,sum) # use ! to inverse 1 (to 0 0) and 0 (to 1).
+ data <- data[,-which(na_flag == 0)]
+ }
+ else if (dim == 1){
+ na_flag <- apply(!is.na(data),1,sum)
+ data <- data[-which(na_flag == 0),]
+ }
+ else{
+ warning("dim can only equal to 1 and 2, 1 means row, 2 means column ")
+ }
+ return(data)
+ }
> drop_Nas(student,1)
name age class gender
1 aa 10 6 m
2 bb <NA> 6 <NA>
3 <NA> 13 8 <NA>
4 DD 9 6 <NA>
来源:https://zhuanlan.zhihu.com/p/48997338