[R] invalid type error

David Winsemius dwinsemius at comcast.net
Mon Jul 19 22:57:03 CEST 2010


On Jul 19, 2010, at 3:43 PM, Erik Iverson wrote:

> jd6688 wrote:
>>> myDF =
>> data.frame(id=c("A10","A20"),d1=c(.3,.3),d2=c(.4,.4),d3=c(-. 
>> 2,.5),d4=c(-.3,.6),d5=c(.5,-.2),d6=c(.6,-.4),d7=c(-.9,-.5),d8=c(-. 
>> 8,-.6))
>>> doit=function(x)c(x[1],sum_LK_positive=sum(x[-1] 
>>> [x[-1]>0]),sum_LK_negative=sum(x[-1][x[-1]<0]))
>>> myDF
>>   id  d1  d2   d3   d4   d5   d6   d7   d8
>> 1 A10 0.3 0.4 -0.2 -0.3  0.5  0.6 -0.9 -0.8
>> 2 A20 0.3 0.4  0.5  0.6 -0.2 -0.4 -0.5 -0.6
>>> t(apply(myDF,1,doit))
>> Error in sum(x[-1][x[-1] > 0]) : invalid 'type' (character) of  
>> argument:
>> I changed the id=c(100,101) in myDF, it worked. are there any way  
>> to have
>> this working if the id=c("a10","a20")?
>
> doit <-  
> function(x)c(sum_LK_positive=sum(x[x>0]),sum_LK_negative=sum(x[x<0]))
>
> cbind(myDF, t(apply(myDF[-1],1,doit)))

And the reason that works (which I'm sure Erik knows)  is that it does  
not pass the entire row which would result in coercion of the row  
vector to the "lowest common type"  ... which in this case would be  
"character". And I think the OP might have wanted this:

 > cbind(myDF[,1,drop=FALSE], t(apply(myDF[-1],1,doit)))
    id sum_LK_positive sum_LK_negative
1 A10             1.8            -2.2
2 A20             1.8            -1.7

And the reason the  ",drop=FALSE" is needed is that otherwise the  
vector and the matrix would have been non-conformable after the column  
vector became a row vector.
-- 

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list