首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从R中的数据中删除带有inf的行

如何从R中的数据中删除带有inf的行
EN

Stack Overflow用户
提问于 2016-04-13 06:24:43
回答 8查看 102K关注 0票数 47

我有一个非常大的dataframe(df),它有大约35-45列(变量)和大于300的行。有些行在单个变量或多个变量中包含NA、NaN、Inf、-Inf值,我使用na.omit(df)删除带有NA和NaN的行,但不能使用na.omit函数删除带有Inf和-Inf值的行。

在搜索时,我遇到了这个线程Remove rows with Inf and NaN in R,并使用了修改过的代码df[is.finite(df)],但是它没有删除Inf和-Inf的行,并且也给出了这个错误。

is.finite(df)中的错误:类型“list”未实现的默认方法

编辑

删除整行,即使对应的一个或多个列都有inf和-inf

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2016-04-13 06:31:39

要删除带有+/-Inf的行,我建议如下:

代码语言:javascript
运行
复制
df <- df[!is.infinite(rowSums(df)),]

或者,相当的,

代码语言:javascript
运行
复制
df <- df[is.finite(rowSums(df)),]

第二个选项(带有is.finite()和不带否定词的选项)也删除包含NA值的行,以防这一操作尚未完成。

票数 51
EN

Stack Overflow用户

发布于 2019-03-16 14:56:04

根据数据的不同,有几个选项使用dplyr::filter()is.finite()is.infinite()的作用域变体,这些选项可能有用:

代码语言:javascript
运行
复制
library(dplyr)

# sample data
df <- data_frame(a = c(1, 2, 3, NA), b = c(5, Inf, 8, 8), c = c(9, 10, Inf, 11), d = c('a', 'b', 'c', 'd'))

# across all columns:
df %>% 
  filter_all(all_vars(!is.infinite(.)))

# note that is.finite() does not work with NA or strings:
df %>% 
  filter_all(all_vars(is.finite(.)))

# checking only numeric columns:
df %>% 
  filter_if(~is.numeric(.), all_vars(!is.infinite(.)))

# checking only select columns, in this case a through c:
df %>% 
  filter_at(vars(a:c), all_vars(!is.infinite(.)))
票数 24
EN

Stack Overflow用户

发布于 2016-04-13 06:25:53

is.finite工作在vector上,而不是data.frame对象上。因此,我们可以使用data.frame循环使用lapply,并且只得到‘有限’值。

代码语言:javascript
运行
复制
lapply(df, function(x) x[is.finite(x)])

如果每个列的Inf-Inf值不同,那么上面的代码将有一个具有不相等length的元素的list。所以,最好还是把它作为一个list。如果我们想要一个data.frame,它应该有相同的长度。

如果要删除包含NA或Inf/-Inf值的行

代码语言:javascript
运行
复制
df[Reduce(`&`, lapply(df, function(x) !is.na(x)  & is.finite(x))),]

或者@nicola的一个紧凑的选项

代码语言:javascript
运行
复制
df[Reduce(`&`, lapply(df, is.finite)),]

如果我们准备好使用一个包,一个紧凑的选项将是NaRV.omit

代码语言:javascript
运行
复制
library(IDPmisc)
NaRV.omit(df)

数据

代码语言:javascript
运行
复制
set.seed(24)
df <- as.data.frame(matrix(sample(c(1:5, NA, -Inf, Inf), 
                      20*5, replace=TRUE), ncol=5))
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36590230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档