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

______________________________________________
R-help@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.

Reply via email to