如何删除R语言中含有NA的列 2020-09-22

 

【转】删除只含有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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值