0

我有一个数据框

df=data.frame(a=1:5,b=c(1,3,4,-999999,4))

并想计算它的平均值,但想排除异常值,在这种情况下为 -9999

有没有类似的命令

na.rm

所以我可以去

apply(df,1,function(x) mean(if x>-100 & x <100))

请注意,我的 df if 600 x 50 dim

4

3 回答 3

2

如果你想要整个数据框的平均值,你可以切入正题并使用:

mean(df[df > -100 & df < 100])

当我将其应用于您提供的 df 时,我得到了预期的答案:3。

于 2016-06-17T11:37:44.967 回答
2

我们可以replace根据逻辑条件将 'df' 中的值设置为 NA 并使用rowMeans.

rowMeans(replace(df, !(df < 100 & df > -100) , NA), na.rm=TRUE)
#[1] 1.0 2.5 3.5 4.0 4.5

或者正如评论中提到的@RHertel

rowMeans(replace(df, abs(df) > 100 , NA), na.rm=TRUE) 
#[1] 1.0 2.5 3.5 4.0 4.5

或者另一种选择是循环遍历“df”的列,使用 获取异常值观察值boxplot.stats,将异常值转换为NA并执行rowMeans.

rowMeans(sapply(df, function(x)  x*NA^(x %in% boxplot.stats(x)$out)), na.rm=TRUE)
#[1] 1.0 2.5 3.5 4.0 4.5
于 2016-06-17T11:21:56.827 回答
0

您为您的案例编写自己的函数,不包括 -9999 值

y<-function(x){mean(x[!grepl("\\-999",x)])}

y(df$b)

[1] 3
于 2016-06-17T11:48:49.877 回答