# [R] calculating mean excluding zeros

Sarah Goslee sarah.goslee at gmail.com
Wed Jul 20 02:06:28 CEST 2011

```On Tue, Jul 19, 2011 at 5:20 PM, Dimitri Liakhovitski
<dimitri.liakhovitski at gmail.com> wrote:
> Thanks a lot, Sarah.
> I assume, if the values against which I am comparing are REALLY zero
> ("0") - then even the first one (mean(testvec[testvec != 0])) should
> work, right?
> Dimitri

Well, yes. But what's "really" zero?

> ((.2 + .1) - .3) == 0
[1] FALSE
> all.equal(((.2 + .1) - .3), 0)
[1] TRUE

"0" is a string, and string comparison is a different issue, not
subject to machine precision.

Sarah

> On Tue, Jul 19, 2011 at 4:56 PM, Sarah Goslee <sarah.goslee at gmail.com> wrote:
>> In the more general case, that approach is prone to machine precision
>> error (FAQ 7.31).
>>
>> Here's a clunky but safer alternative:
>>
>>> set.seed(1234)
>>> testvec <- sample(0:10, 100, replace=TRUE)
>>> mean(testvec)
>> [1] 4.31
>>> mean(testvec[testvec != 0])
>> [1] 4.842697
>>> mean(testvec[!sapply(testvec, function(x)isTRUE(all.equal(x, 0)))])
>> [1] 4.842697
>>>
>>
>> (Is there an elementwise equivalent to all.equal() that I'm missing?)
>>
>> Sarah
>> On Tue, Jul 19, 2011 at 4:48 PM, Weidong Gu <anopheles123 at gmail.com> wrote:
>>> You can do it by subsetting or indexing
>>>
>>>  r<-c(0,0,0,rnorm(10,10,5))
>>>> mean(r)
>>> [1] 8.052215
>>>> mean(r[r!=0])
>>> [1] 10.46788
>>>
>>> Weidong Gu
>>>
>>> On Tue, Jul 19, 2011 at 4:36 PM, Dimitri Liakhovitski
>>> <dimitri.liakhovitski at gmail.com> wrote:
>>>> Sorry if it's been discussed before - don't seem to find it.
>>>> I'd like to calculate a mean while ignoring zeros.
>>>> "mean" doesn't seem to have an option for that.
>>>> Any other function/package that could do it?
>>>>
>>>> Thanks for a pointer!
>>>
--
Sarah Goslee
http://www.functionaldiversity.org

```