重新定义base::mean()函数以包括is.finite()功能

3

我希望重新定义均值函数(以便在tabular()表格中应用),使其省略某个变量的所有NA、NaN和Inf观测值。我不想删除整行(观测值),而是希望均值公式仅计算非NA、NaN和Inf值的平均值。

Mean.new <- function(x) base::mean(x, na.rm=TRUE)

据我所知,在标准的mean()函数中,na.rm=TRUE仅删除NAs,而不是NaN和Inf。
因此,如何在上面的代码中添加检查is.finite()的功能(这将排除所有NA,NaN,Inf)?
谢谢和祝好,
cork
2个回答

6

使用 is.finite 函数:

mean_new <- function(x) {mean(x[is.finite(x)])}

mean_new(c(NA,Inf,NaN,1,2))

[1] 1.5

3

基础R为通用的mean定义了默认方法,所以这里提供一种方法,通过为类"numeric"的对象定义一个方法来实现。

示例数据来自Waldi的答案。与他的答案不同的是,我取反了is.infinite,因为is.finite对于缺失值(NA)也会返回TRUE,而参数na.rm将无关紧要,缺失值总是会被删除。从文档?is.finite中可以看到,我的强调:

说明
is.finite和is.infinite返回与x相同长度的向量,指示哪些元素是有限的(既非无穷大也非缺失)或无限的。

在这个说明中,缺失值部分仅指有限元素,而is.infinite的预期行为是针对-Inf/Inf的值返回TRUE,但不针对NANaN

然后代码变成了这样:

mean.numeric <- function(x, trim = 0, na.rm = FALSE, ...){
  x <- x[!is.infinite(x)]
  mean.default(x, trim = trim, na.rm = na.rm, ...)
}

y <- c(NA,Inf,NaN,1,2)

is.finite(y)
#[1] FALSE FALSE FALSE  TRUE  TRUE
!is.infinite(y)
#[1]  TRUE FALSE  TRUE  TRUE  TRUE
 
mean(y)
#[1] NA
mean(y, na.rm = TRUE)
#[1] 1.5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接