[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})
>> head(test)
> 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

More information about the R-help mailing list