[R] Fwd: Recoding in R conditioned on a certain value.

David Winsemius dwinsemius at comcast.net
Sun Apr 6 19:13:23 CEST 2014


On Apr 5, 2014, at 8:37 PM, Kate Ignatius wrote:

> Thanks,
>
> I ended up using this.  I was curious how to get the mean of multiple
> columns by chrom (or Plan with the example below).  Using this data
> for example:
>
> Plan   X       mm  mm2
> 1  95 0.323000 0.400303
> 1 275 0.341818 0.400303
> 1   2 0.618000 0.400303
> 1  75 0.320000 0.400303
> 1  13 0.399000 0.400303
> 1  20 0.400000 0.400303
> 2 219 0.393000 0.353350
> 2  50 0.060000 0.353350
> 2 213 0.390000 0.353350
> 2 204 0.496100 0.353350
> 2  19 0.393000 0.353350
> 2 201 0.388000 0.353350
>
> I've tried:
>
> pp$meanmm <- with(pp, ave(pp[,3:4], Plan, FUN = mean))

People should do some 'dimensional analysis' when they get errors.  
(And they should report the text of the errors.) The length and width  
of what is specified on the LHS should be the same as what would be  
produced on the RHS of hte assignment. But that would not have been  
the first error that was encountered. You tried to pass two columns as  
the first argument to a function that expected one, and then you tried  
to assign the result to one column. This might have a better chance.

pp[ c('mean.m1' , 'mean.m2') ] <- lapply( pp[ , 3:4] , function(x)  
ave(x, pp$Plan, FUN=mean) )


 > pp
    Plan   X       mm      mm2  mean.m1  mean.m2
1     1  95 0.323000 0.400303 0.400303 0.400303
2     1 275 0.341818 0.400303 0.400303 0.400303
3     1   2 0.618000 0.400303 0.400303 0.400303
snipped

-- 
David.

>
> But that doesn't seem to work.
>
> On Sat, Apr 5, 2014 at 4:18 PM, David Winsemius <dwinsemius at comcast.net 
> > wrote:
>>
>> On Apr 5, 2014, at 9:51 AM, Kate Ignatius wrote:
>>
>>> I'm trying to work out the average of a certain value by chromosome.
>>> I've done the following, but it doesn't seem to work:
>>>
>>> Say, I want to find average AD for chromosome 1 only and paste the
>>> value next to all the positions on chromosome 1:
>>>
>>> [sam$chrom == '1'] <-
>>> (sam$ad)/(colSums(sam[c(1:nrow(sam$chrom=='1'))],))
>>
>> It "looks" wrong to me because of the mismatching lengths of the  
>> lhs and rhs but since you have not provided a test dataset that's  
>> all I will say.
>>
>> The usual way to calculate a function within categorical groupings  
>> that will be "re-inserted" alongside the original dataframe is to  
>> use `ave`:
>>
>> sam$mmad <- with( sam, ave(ad, chrom, FUN=mean) )
>>
>>
>>>
>>> I know this is convoluted and possible wrong... but I would like  
>>> to do
>>> this for all chromosomes.
>>>
>>> Thanks!
>> --
>> David Winsemius
>> Alameda, CA, USA
>>

David Winsemius, MD
Alameda, CA, USA


David Winsemius, MD
Alameda, CA, USA




More information about the R-help mailing list