【R】如何去掉数据框中包含非数值的行?
这个需求还是很常见的,因为我们在处理数据的时候无法全面考虑到数据框中含有哪些类型的数据,比如含有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】如何去掉数据框中包含非数值的行?的更多相关文章
- 用R语言提取数据框中日期对应年份(列表转矩阵)
用R语言提取数据框中日期对应年份(列表转矩阵) 在数据处理中常会遇到要对数据框中的时间做聚类处理,如从"%m/%d/%Y"中提取年份. 对应操作为:拆分成列表——列表转矩阵——利用 ...
- R语言数据框中,用0替代NA缺失值
1.用0替代数据框中的缺失值NA 生成数据框: > m <- matrix(sample(c(NA, :), , replace = TRUE), ) > d <- as.da ...
- R语言学习——数据框
> #数据框可以包含不同模式(数值型.字符型.逻辑型等)的数据,是R中最常处理的数据结构.数据框可以通过函数data.frame()创建:mydata<-data.frame(coll,c ...
- MFC 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,已解决。
CKagulaCEdit是CEdit的一个继承类,m_edit的CKagulaCEdit类型的一个变量 调用的时候,是这样的: 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,问题如下: 这时 ...
- Python中dataframe数据框中选择某一列非空的行
利用pandas自带的函数notnull可以很容易判断某一列是否为null类型,但是如果这一列中某一格为空字符串"",此时notnull函数会返回True,而一般我们选择非空行并不 ...
- 在javaScript中把非数值类型的数据自动转换为数值类型的两种方式
一.使用Number()函数. 二.使用parseInt()/parseFloat()函数. 详情: 一.使用Number()函数将非数值类型的数据自动的转化为数组类型 Number()函数可以将任何 ...
- R: data.frame 数据框的:查询位置、排序(sort、order)、筛选满足条件的子集。。
################################################### 问题:数据框 data.frame 查.排序等, 18.4.27 怎么对数据框 data.f ...
- 2-7 R语言基础 数据框
#数据框 > df <- data.frame(id=c(1,2,3,4),name=c("a","b","c","d ...
- R语言中将数据框(data.frame)中字符型数据转化为数值型
as.data.frame(lapply(data,as.numeric))
随机推荐
- 第五次Alpha Scrum Meeting
本次会议为Alpha阶段第五次Scrum Meeting会议 会议概要 会议时间:2021年4月30日 会议地点:线上会议 会议时长:15min 会议内容简介:本次会议以主要围绕卡牌对接的诸多问题与对 ...
- BUAA2020软工作业(五)——软件案例分析
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件案例分析作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方面 ...
- Vue | uni-app 中使用websocket
@ 目录 首先在根目录下新建一个store文件夹,并新建一个websocket.js文件,代码如下: import Vue from 'vue' import Vuex from 'vuex' Vue ...
- 按之字形顺序打印二叉树 牛客网 剑指Offer
按之字形顺序打印二叉树 牛客网 剑指Offer 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 ...
- Wedding DJ题解 (回归OI)
写在前面 高考结束了, 很遗憾, 我是其中的失败者, zzu, 没有想过最后来到这个学校, 并且还是信息安全专业, 不过, 时间久了, 也慢慢适应了: 当我被这个学校的这个专业录取, 也就注定着, 我 ...
- JMeter学习笔记--关联
1.什么是关联? 本次请求需要的数据,需要上一步的请求返回给提供的过程. 2.JMeter关联中常用的两种方式 正则表达式提取器 正则表达式提取器用于对页面任何文本的提取,提取的内容是根据正则表达式在 ...
- Firefox火狐浏览器提示您的链接并不安全(解决办法)
火狐浏览器不管访问什么,一直提示连接不安全 解决办法: 1.在Firefox地址栏输入"about:config",回车,进入如下图页面 点击"我了解此风险" ...
- 一.Promise入门准备阶段
一.Promise入门准备阶段 1.区别实例对象呵函数对象 2.两种类型的回调函数(同步与异步) 2.1 同步回调 2.2 异步回调 3.JS的error处理 3.1 错误的类型 3.2 错误处理与错 ...
- 聊聊sql优化的15个小技巧
前言 sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到. 如果某天你负责的某个线上接口,出现了性能问题,需要做优化.那么你首先想到的很有可能是优化sql语句,因为它 ...
- @PostConstruct和static静态块初始化的区别
static blocks are invoked when the class is being initialized, after it is loaded. The dependencies ...