这个需求还是很常见的,因为我们在处理数据的时候无法全面考虑到数据框中含有哪些类型的数据,比如含有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. 状压dp学习笔记(紫例题集)

    P3451旅游景点 Tourist Attractions 这个代码其实不算是正规题解的(因为我蒟蒻)是在我们的hzoj上内存限制324MIB情况下过掉的,而且经过研究感觉不太能用滚动数组,所以那这个 ...

  2. [HNOI2009]双递增序列(洛谷P4728)+小烈送菜(内部训练题)——奇妙的dp

    博主学习本题的经过嘤嘤嘤: 7.22 : 听学长讲(一知半解)--自己推(推不出来)--网上看题解--以为自己会了(网上题解是错的)--发现错误以后又自己推(没推出来)--给学长发邮件--得到正确解法 ...

  3. Machine learning (6-Logistic Regression)

    1.Classification However, 2.Hypothesis Representation Python code: import numpy as np def sigmoid(z) ...

  4. iPhone SE切换颜色特效

    Apple 网站的特效, iPhone SE 共有黑.白.红三种颜色,在卷动页面的时候会逐步替换,看起来效果非常时尚,在此供上代码学习. <!DOCTYPE html> <html& ...

  5. Apache Kafka 学习笔记

    1. 介绍Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据. 这种动 ...

  6. 算法:N-gram语法

    一.N-gram介绍 n元语法(英语:N-gram)指文本中连续出现的n个语词.n元语法模型是基于(n - 1)阶马尔可夫链的一种概率语言模型,通过n个语词出现的概率来推断语句的结构.这一模型被广泛应 ...

  7. 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(二)

    一.基于邻接表的Dijkstra算法 如前一篇文章所述,在 Dijkstra 的算法中,维护了两组,一组包含已经包含在最短路径树中的顶点列表,另一组包含尚未包含的顶点.使用邻接表表示,可以使用 BFS ...

  8. 你知道怎么从jar包里获取一个文件的内容吗

    目录 背景 报错的代码 原先的写法 编写测试类 找原因 最终代码 背景 项目里需要获取一个excle文件,然后对其里的内容进行修改,这个文件在jar包里,怎么尝试都读取不成功,但是觉得肯定可以做到,因 ...

  9. 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序

    上一篇:手把手教你学Dapr - 2. 必须知道的概念 注意: 文章中提到的命令行工具即是Windows Terminal/PowerShell/cmd其中的一个,推荐使用Windows Termin ...

  10. 第K个数 牛客网 程序员面试金典 C++ Python

    第K个数 牛客网 程序员面试金典 C++ Python 题目描述 有一些数的素因子只有3.5.7,请设计一个算法,找出其中的第k个数. 给定一个数int k,请返回第k个数.保证k小于等于100. 测 ...