[R] run function on subsets of matrix

David Winsemius dwinsemius at comcast.net
Sun Mar 27 14:25:53 CEST 2011


On Mar 27, 2011, at 3:22 AM, peter dalgaard wrote:

>
> On Mar 27, 2011, at 08:25 , David Winsemius wrote:
>
>>
>> On Mar 26, 2011, at 10:26 PM, fisken wrote:
>>
>>> I was wondering if it is possible to do the following in a smarter  
>>> way.
>>>
>>> I want get the mean value across the columns of a matrix, but I want
>
> _along_ the columns, I assume.
>
>>> to do this on subrows of the matrix, given by some vector(same  
>>> length
>>> as the the number of rows). Something like
>>>
>>> nObs<- 6
>>> nDim <- 4
>>> m  <-   matrix(rnorm(nObs*nDim),ncol=nDim)
>>> fac<-sample(1:(nObs/2),nObs,rep=T)
>>>
>>> ##loop trough different 'factor' levels
>>> for (i in unique(fac))
>>>  print(apply(m[fac==i,],2,mean))
>>
>> This would be a lot simpler and faster:
>>
>> colMeans(m[unique(fac),])
>>
>> #[1]  1.3595197 -0.1374411  0.1062527 -0.3897732
>>
>
> Say what??? (I suspect David needs to get his sleep - or coffee, if  
> he is in Europe.)

At that point it was sleep that I needed. Now ....  trying to decide  
if I should just go back to bed or make coffee.

>
> How about:
>
>> aggregate(m,list(fac),mean)
>  Group.1          V1         V2         V3           V4
> 1       1 -0.03785420 -0.2573805 -0.3025759  0.006999996
> 2       2 -1.39961300  0.2296900 -0.1122359 -0.302734531
> 3       3  0.50886649  0.6546153 -0.4270368 -0.411807709
>> by(m,list(fac),colMeans)
> : 1
>          V1           V2           V3           V4
> -0.037854195 -0.257380542 -0.302575901  0.006999996
> -------------------------------------------------------------
> : 2
>        V1         V2         V3         V4
> -1.3996130  0.2296900 -0.1122359 -0.3027345
> -------------------------------------------------------------
> : 3
>        V1         V2         V3         V4
> 0.5088665  0.6546153 -0.4270368 -0.4118077
>>
>
>
>
> -- 
> Peter Dalgaard
>

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list