[R] Median computation
Bert Gunter
gunter.berton at gene.com
Wed May 23 19:17:35 CEST 2012
Assuming your original matrix IS a matrix, call it yourmat, and not a
data frame (whose columns **must* have unique names if you haven't
messed with the check.names default) then maybe:
#### UNTESTED!!! ###
thenames <- unique(dimnames(yourmat)[[2]])
ans <- lapply(thenames, function(nm, {
apply( yourmat[, thenames==nm],1, median,na.rm=TRUE)
})
If I got it right, ans should be a list of vectors, one per unique
column name, each of which gives rowwise medians of the columns with
the same name. This can be combined into a new matrix e.g. by
do.call(cbind,ans) if you like. You could get a matrix answer
directly if you use sapply or, maybe faster, vapply instead of lapply,
but I find lists simpler to begin with.
I believe this should be reasonably fast. Converting to and from data
frames and operating on data frames slows things down a lot, because
these are very general structures that must keep track of a lot of
overhead when being worked on. Matrices do not.
-- Bert
On Wed, May 23, 2012 at 9:46 AM, Preeti <preeti at sci.utah.edu> wrote:
> Hello Everybody,
>
> The code:
>
> dfmed<-lapply(unique(colnames(df)), function(x)
> rowMedians(as.matrix(df[,colnames(df) == x]),na.rm=TRUE))
>
> takes really long time to execute ( in hours). Is there a faster way to do
> this?
>
> Thanks!
>
> On Tue, May 22, 2012 at 3:46 PM, Preeti <preeti at sci.utah.edu> wrote:
>
>> Thanks Henrik! Here is the one-liner that I wrote:
>>
>> dfmed<-lapply(unique(colnames(df)), function(x)
>> rowMedians(as.matrix(df[,colnames(df) == x]),na.rm=TRUE))
>>
>> Thanks again!
>>
>>
>> On Tue, May 22, 2012 at 3:23 PM, Henrik Bengtsson <hb at biostat.ucsf.edu>wrote:
>>
>>> See rowMedians() of the matrixStats package for replacing apply(x,
>>> MARGIN=1, FUN=median). /Henrik
>>>
>>> On Tue, May 22, 2012 at 12:34 PM, Preeti <preeti at sci.utah.edu> wrote:
>>> > Hi,
>>> >
>>> > I have a 250,000 by 300 matrix. I am trying to calculate the median of
>>> > those columns (by row) with column names that are identical. I would
>>> like
>>> > this to be efficient since apply(x,1,median) where x is created by
>>> choosing
>>> > only those columns with same column name and looping on this is taking a
>>> > really long time. Is there an efficient way to do this?
>>> >
>>> > Thanks!
>>> >
>>> > [[alternative HTML version deleted]]
>>> >
>>> > ______________________________________________
>>> > R-help at r-project.org mailing list
>>> > https://stat.ethz.ch/mailman/listinfo/r-help
>>> > PLEASE do read the posting guide
>>> http://www.R-project.org/posting-guide.html
>>> > and provide commented, minimal, self-contained, reproducible code.
>>>
>>
>>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
--
Bert Gunter
Genentech Nonclinical Biostatistics
Internal Contact Info:
Phone: 467-7374
Website:
http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
More information about the R-help
mailing list