sapply Call Returning " the condition has length > 1" Error
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.zhang at 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 <jfox at mcmaster.ca>
To: 'Alex Zhang' <alex.zhang at ymail.com>
Cc: r-help at 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-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]]
? ? ? ?[[alternative HTML version deleted]]
______________________________________________
R-help at 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.