sapply Call Returning " the condition has length > 1" Error
Dear Alex,
-----Original Message-----
From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
project.org] On Behalf Of Alex Zhang
Sent: December-27-11 2:14 PM
To: r-help at 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]]