我有一个非常大的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。
发布于 2016-04-13 06:31:39
要删除带有+/-Inf
的行,我建议如下:
df <- df[!is.infinite(rowSums(df)),]
或者,相当的,
df <- df[is.finite(rowSums(df)),]
第二个选项(带有is.finite()
和不带否定词的选项)也删除包含NA
值的行,以防这一操作尚未完成。
发布于 2019-03-16 14:56:04
根据数据的不同,有几个选项使用dplyr::filter()
和is.finite()
或is.infinite()
的作用域变体,这些选项可能有用:
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(.)))
发布于 2016-04-13 06:25:53
is.finite
工作在vector
上,而不是data.frame
对象上。因此,我们可以使用data.frame
循环使用lapply
,并且只得到‘有限’值。
lapply(df, function(x) x[is.finite(x)])
如果每个列的Inf
、-Inf
值不同,那么上面的代码将有一个具有不相等length
的元素的list
。所以,最好还是把它作为一个list
。如果我们想要一个data.frame
,它应该有相同的长度。
如果要删除包含NA或Inf/-Inf值的行
df[Reduce(`&`, lapply(df, function(x) !is.na(x) & is.finite(x))),]
或者@nicola的一个紧凑的选项
df[Reduce(`&`, lapply(df, is.finite)),]
如果我们准备好使用一个包,一个紧凑的选项将是NaRV.omit
。
library(IDPmisc)
NaRV.omit(df)
数据
set.seed(24)
df <- as.data.frame(matrix(sample(c(1:5, NA, -Inf, Inf),
20*5, replace=TRUE), ncol=5))
https://stackoverflow.com/questions/36590230
复制相似问题