这个需求还是很常见的,因为我们在处理数据的时候无法全面考虑到数据框中含有哪些类型的数据,比如含有NA、NaN或Inf,甚至是一些乱七八糟的字符串。这时不论做统计分析还是作图,都会带来意想不到的错误。为防止这种现象发生,有必要在分析数据前将这些含有特殊字符的行去掉。

1. 去掉指定列中包含NA/Inf/NaN的行

#如果只是包含NA/Inf/NaN,读入都是视为数值
d <- data.frame(x=c(NA,2,3,Inf,-Inf,NaN),y=c(1,Inf,6,NA,4,NaN))
d
str(d) > d
x y
1 NA 1
2 2 Inf
3 3 6
4 Inf NA
5 -Inf 4
6 NaN NaN 'data.frame': 6 obs. of 2 variables:
$ x: num NA 2 3 Inf -Inf ...
$ y: num 1 Inf 6 NA 4 ...

单独去掉:

> d[!is.na(d$x),] #去掉NA和NaN
x y
2 2 Inf
3 3 6
4 Inf NA
5 -Inf 4 > d[!is.nan(d$x),] #去掉NaN
x y
1 NA 1
2 2 Inf
3 3 6
4 Inf NA
5 -Inf 4 > d[!is.infinite(d$x),] #去掉Inf
x y
1 NA 1
2 2 Inf
3 3 6
6 NaN NaN

一次去掉:

> d[is.finite(d$x),]  #去掉Inf、NA和NaN,推荐
x y
2 2 Inf
3 3 6 > d[!is.na(d$x)&!is.nan(d$x)&!is.infinite(d$x),]
x y
2 2 Inf
3 3 6

2. 去掉指定列中包含其他乱七八糟字符串的行

如果除了以上三种,还包含其他乱七八糟的字符(一般读入时默认这一列就是因子类型),比如:

d <- data.frame(x=c(NA,2.0,3.3,0.2,4,Inf,NaN,"*","$","#"),y=c(1,NA,4,"*",'&',2,3,4,2,1))
> d
x y
1 <NA> 1
2 2 <NA>
3 3.3 4
4 0.2 *
5 4 &
6 Inf 2
7 NaN 3
8 * 4
9 $ 2
10 # 1
> str(d)
'data.frame': 10 obs. of 2 variables:
$ x: Factor w/ 9 levels "#","$","*","0.2",..: NA 5 6 4 7 8 9 3 2 1
$ y: Factor w/ 6 levels "&","*","1","2",..: 3 NA 6 2 1 4 5 6 4 3

去掉NA还是可以同上:

> d[!is.na(d$x),]
x y
2 2 <NA>
3 3.3 4
4 0.2 *
5 4 &
6 Inf 2
7 NaN 3
8 * 4
9 $ 2
10 # 1

但NaN和Inf就不行了,因为is.nan和is.infinite函数只识别数值型。

> d[!is.nan(d$x),]
x y
1 <NA> 1
2 2 <NA>
3 3.3 4
4 0.2 *
5 4 &
6 Inf 2
7 NaN 3
8 * 4
9 $ 2
10 # 1 > d[!is.infinite(d$x),]
x y
1 <NA> 1
2 2 <NA>
3 3.3 4
4 0.2 *
5 4 &
6 Inf 2
7 NaN 3
8 * 4
9 $ 2
10 # 1 > d[is.finite(d$x),]
x y
2 2 <NA>
3 3.3 4
4 0.2 *
5 4 &
6 Inf 2
7 NaN 3
8 * 4
9 $ 2
10 # 1

如果硬要这么干,就要进行类型转换,注意因子转数值需要字符做桥梁哦~

> d[!is.nan(as.numeric(as.character(d$x))),]
x y
1 <NA> 1
2 2 <NA>
3 3.3 4
4 0.2 *
5 4 &
6 Inf 2
8 * 4
9 $ 2
10 # 1
Warning message:
In `[.data.frame`(d, !is.nan(as.numeric(as.character(d$x))), ) :
NAs introduced by coercion > d[!is.infinite(as.numeric(as.character(d$x))),]
x y
1 <NA> 1
2 2 <NA>
3 3.3 4
4 0.2 *
5 4 &
7 NaN 3
8 * 4
9 $ 2
10 # 1
Warning message:
In `[.data.frame`(d, !is.infinite(as.numeric(as.character(d$x))), :
NAs introduced by coercion > d[is.finite(as.numeric(as.character(d$x))),]
x y
2 2 <NA>
3 3.3 4
4 0.2 *
5 4 &
Warning message:
In `[.data.frame`(d, is.finite(as.numeric(as.character(d$x))), ) :
NAs introduced by coercion

警告信息可以看到,乱七八糟字符强制转换数值视为NA了。因为数据量足够大的时候,我们无法知道数据里还含有什么妖魔鬼怪,这时可以只识别数字来提取(不包含NA、Inf和NaN):

t <- grep("^\\d+$",as.character(d$x))
#as.numeric(as.character(d$x[t]))
d[t,] #这里还是因子型,根据需要再转换为数值 > t
[1] 2 5
> d[t,]
x y
2 2 <NA>
5 4 &

3. 去掉整个数据框中包含非数值的行

如果我们是针对整个数据框去除包含非数值的行?

只包含NA、NaN和Inf的情况

d <- data.frame(x=c(NA,2,3,Inf,-Inf,NaN),y=c(1,Inf,6,NA,4,NaN))
> na.omit(d)
x y
3 3.3 4
4 0.2 *
5 4 &
6 Inf 2
7 NaN 3
8 * 4
9 $ 2
10 # 1 > d[!is.nan(rowSums(d)),]
x y
1 NA 1
2 2 Inf
3 3 6
4 Inf NA
5 -Inf 4 > d[!is.infinite(rowSums(d)),] #为啥还有一个Inf的行?
x y
1 NA 1
3 3 6
4 Inf NA
6 NaN NaN > d[is.finite(rowSums(d)),] #去掉Inf、NA和NaN,推荐
x y
3 3 6

或者使用R包IDPmisc::NaRv来处理:

> require(IDPmisc)
> NaRV.omit(d)
x y
3 3 6

针对其他字符情况

我自己随便写的:

> index <- apply(d,1,function(x){grepl("^\\d+$",as.character(x))})
> index
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] FALSE TRUE TRUE FALSE FALSE FALSE
[2,] TRUE FALSE TRUE FALSE TRUE FALSE > d[apply(index,2,function(x)all(x)),]
x y
3 3 6

4. 总结下推荐用法

  • 指定列,且只含有NA/Inf/NaN:
d[is.finite(d$x),]
  • 指定列,含有其他字符:
d[is.finite(as.numeric(as.character(d$x))),]
  • 不指定列,且只含有NA/Inf/NaN:
d[is.finite(rowSums(d)),]

IDPmisc::NaRV.omit(d)
  • 不指定列,含有其他字符:
index <- apply(d,1,function(x){grepl("^\\d+$",as.character(x))})
d[apply(index,2,function(x)all(x)),]

Ref:https://stackoverflow.com/questions/15773189/remove-na-nan-inf-in-a-matrix

https://www.thinbug.com/q/25276155

【R】如何去掉数据框中包含非数值的行?的更多相关文章

  1. 用R语言提取数据框中日期对应年份(列表转矩阵)

    用R语言提取数据框中日期对应年份(列表转矩阵) 在数据处理中常会遇到要对数据框中的时间做聚类处理,如从"%m/%d/%Y"中提取年份. 对应操作为:拆分成列表——列表转矩阵——利用 ...

  2. R语言数据框中,用0替代NA缺失值

    1.用0替代数据框中的缺失值NA 生成数据框: > m <- matrix(sample(c(NA, :), , replace = TRUE), ) > d <- as.da ...

  3. R语言学习——数据框

    > #数据框可以包含不同模式(数值型.字符型.逻辑型等)的数据,是R中最常处理的数据结构.数据框可以通过函数data.frame()创建:mydata<-data.frame(coll,c ...

  4. MFC 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,已解决。

    CKagulaCEdit是CEdit的一个继承类,m_edit的CKagulaCEdit类型的一个变量 调用的时候,是这样的: 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,问题如下: 这时 ...

  5. Python中dataframe数据框中选择某一列非空的行

    利用pandas自带的函数notnull可以很容易判断某一列是否为null类型,但是如果这一列中某一格为空字符串"",此时notnull函数会返回True,而一般我们选择非空行并不 ...

  6. 在javaScript中把非数值类型的数据自动转换为数值类型的两种方式

    一.使用Number()函数. 二.使用parseInt()/parseFloat()函数. 详情: 一.使用Number()函数将非数值类型的数据自动的转化为数组类型 Number()函数可以将任何 ...

  7. R: data.frame 数据框的:查询位置、排序(sort、order)、筛选满足条件的子集。。

    ################################################### 问题:数据框 data.frame 查.排序等,   18.4.27 怎么对数据框 data.f ...

  8. 2-7 R语言基础 数据框

    #数据框 > df <- data.frame(id=c(1,2,3,4),name=c("a","b","c","d ...

  9. R语言中将数据框(data.frame)中字符型数据转化为数值型

    as.data.frame(lapply(data,as.numeric))

随机推荐

  1. 理解ASP.NET Core - 路由(Routing)

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 Routing Routing(路由):更准确的应该叫做Endpoint Routing,负责 ...

  2. freeswitch的docker构建过程

    概述 Docker是一个开源的应用容器引擎,可以让开发者打包应用以及依赖包到一个轻量级.可移植的容器中,并在任何安装有Docker的机器上运行. Docker 使你能够将应用程序与基础架构分开,从而可 ...

  3. Go语言核心36讲(Go语言进阶技术十三)--学习笔记

    19 | 错误处理(上) 提到 Go 语言中的错误处理,我们其实已经在前面接触过几次了. 比如,我们声明过error类型的变量err,也调用过errors包中的New函数. 我们说过error类型其实 ...

  4. Linux ps -ef 命令输出解释

    UID: 程序拥有者PID:程序的 IDPPID:程序父级程序的 IDC:  CPU 使用的百分比STIME: 程序的启动时间TTY: 登录终端TIME : 程序使用掉 CPU 的时间CMD: 下达的 ...

  5. Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Connection refused

    zabbix 监控连接失败 1.查看配置文件端口,server端口10051开启正常,agent端10050开启正常 2.查看/var/log/zabbix/zabbix_server.log./va ...

  6. Java-基础-HashMap

    1. 简介 Java8 HashMap结构(数组 + 列表 + 红黑树)如图: 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和 ...

  7. C++ 重载、重写、重定义的区别

    C++ 中 重载.重写.重定义的区别 重载(overload) 定义: 在同一个作用域内,两函数的函数名相同, 参数不相同(可以是参数类型不同或者是参数个数不同), 那么就说这两个 函数重载. 分类: ...

  8. JMeter学习笔记--录制脚本(二)

    第一步:在JMeter中添加线程组,命名为访问首页 第二步:在线程组下添加HTTP请求默认值 添加->配置元件->HTTP请求默认值,设置服务器IP和端口号(JMeter默认使用80端口号 ...

  9. 【数据结构&算法】12-线索二叉树

    目录 前言 线索二叉树的概念 线索二叉树的实现 线索二叉树的寻点思路二 类双向链表参考图 参考代码 中序遍历线索化 前言 在<大话数据结构>P190 页中有一句话:其实线索二叉树,就等于是 ...

  10. 大一C语言学习笔记(3)---对于程序员来说,学历和能力,到底哪个重要?

    在高考失利后,我合理地萎靡一段时间,振作起来之后选择了我憧憬了10年的计算机专业---软件工程.但由于分数受限,也是选择了二本普通院校黑科技(我当然爱她,我的母校),而因为学历上的自卑,让我有了想考研 ...