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.