# [R] If and apply?

David Winsemius dwinsemius at comcast.net
Sat Feb 4 01:21:24 CET 2012

```On Feb 3, 2012, at 6:17 PM, brannona at mskcc.org wrote:

> Hello,
>
> I'm trying to replace any value within a column where the value is
> less than 10% of the median of the column with NA.  In other words,
> if the median of one column is 500, any value in that column that is
> less than 50 should become NA.
>
> Doing a lot of searches, it seems like I should be using apply.  But
> when I put the if statement inside like this, I get serious errors:

You didn't show str(gc2) or show us how it might be built.

>
>> test<-apply(gc2,2,function(x){if(x<(0.1*median(x))), NA})
> Error: unexpected ',' in "test<-apply(gc2,2,function(x)
> {if(x<(0.1*median(x))),"

You want ifelse() rather than if(). You also will need to look more
carefully at how 'ifelse' is designed.

>> test<-apply(gc2,2,function(x){if(x<(0.1*median(x))) NA})
> There were 50 or more warnings (use warnings() to see the first 50)
> In if (x < (0.1 * median(x))) x <- NA :
>  the condition has length > 1 and only the first element will be used
>
> Trying
>> test<-apply(gc2,2,function(x){x[x<(0.1*median(x))]<- NA})
> NA.01.N NA.01.T NA.02.N NA.02.T NA.03.N NA.03.T
>     NA      NA      NA      NA      NA      NA

That probably indicates that you need to look more carefully at ?
median because it appears you have at least one NA in each of your
gc2 columns.

>
>
> I'm sure that I could get it to work if I read each column
> individually into a vector, calculate the median, replace the values
> if less than 0.1*median, then rebind it into a new matrix.  However,
> I'm hoping there is a more elegant way.

Perhaps the sweep function?

> 	[[alternative HTML version deleted]]

You should read the Posting Guide and learn how to post plain text.

David Winsemius, MD
West Hartford, CT

```