Tell us what you want to do, not how you want to do it. What is the problem you are trying to solve? You can create your own function/code within the 'apply' to process one element of the vector as a time. What is the output that you expect? There is (almost) always a way of doing it, as long as we know what you want to do.
On Tue, Dec 27, 2011 at 3:34 PM, Alex Zhang <alex.zh...@ymail.com> wrote: > John, > > Thanks for the pointers. > > The DummyFunc is just a made-up example. The true function I need to use is > more complicated and would be distractive to include. > > Do you mean that sapply would take columns in the input data.frame and feed > them into "FUN" as "whole" vectors? That explains the behavior. Is there an > "*apply" function that will fee elements of the input data.frame into "FUN" > instead of whole columns? Thanks. > > > ________________________________ > From: John Fox <j...@mcmaster.ca> > To: 'Alex Zhang' <alex.zh...@ymail.com> > Cc: r-help@r-project.org > Sent: Tuesday, December 27, 2011 3:10 PM > Subject: RE: [R] sapply Call Returning " the condition has length > 1" Error > > Dear Alex, > >> -----Original Message----- >> From: r-help-boun...@r-project.org [mailto:r-help-bounces@r- >> project.org] On Behalf Of Alex Zhang >> Sent: December-27-11 2:14 PM >> To: r-help@r-project.org >> Subject: [R] sapply Call Returning " the condition has length > 1" >> Error >> >> Dear all, >> >> Happy new year! >> >> I have a question re using sapply. Below is a dummy example that would >> replicate the error I saw. >> >> ##Code Starts here >> DummyFunc <- function(x) { >> >> if (x > 0) { >> return (x) >> } else >> { >> return (-x) >> } >> >> } >> >> Y = data.frame(val = c(-3:7)) >> sapply(Y, FUN = DummyFunc) >> ##Code ends here >> >> When I run it, I got: >> val >> [1,] 3 >> [2,] 2 >> [3,] 1 >> [4,] 0 >> [5,] -1 >> [6,] -2 >> [7,] -3 >> [8,] -4 >> [9,] -5 >> [10,] -6 >> [11,] -7 >> Warning message: >> In if (x > 0) { : >> the condition has length > 1 and only the first element will be used >> >> The result is different from what I would expect plus there is such an >> error message. > > This is a warning, not really an error message. A data frame is essentially > a list of variables (columns), and sapply() applies its FUN argument to each > list element, that is, each variable -- the one variable val in your case. > That produces a warning because val > 0 is a vector of 11 elements, and the > first comparison, 3 > 0, which is TRUE, controls the result. > >> >> I guess if the DummyFunc I provided is compatible with vectors, the >> problem would go away. But let's suppose I cannot change DummyFunc. Is >> there still a way to use sapply or alike without actually writing a >> loop? Thanks. > > Well, you could just use > >> abs(Y$val) > [1] 3 2 1 0 1 2 3 4 5 6 7 > > but I suppose that you didn't really want to write your own version of the > absolute-value function as something more than an exercise. > > An alternative is > >> with(Y, ifelse(val > 0, val, -val)) > [1] 3 2 1 0 1 2 3 4 5 6 7 > > I hope this helps, > John > > -------------------------------- > John Fox > Senator William McMaster > Professor of Social Statistics > Department of Sociology > McMaster University > Hamilton, Ontario, Canada > http://socserv.mcmaster.ca/jfox > > > >> >> - Alex >> [[alternative HTML version deleted]] > [[alternative HTML version deleted]] > > > ______________________________________________ > 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. > -- Jim Holtman Data Munger Guru What is the problem that you are trying to solve? Tell me what you want to do, not how you want to do it. ______________________________________________ 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.