[R] sapply Call Returning " the condition has length > 1" Error

jim holtman jholtman at gmail.com
Tue Dec 27 21:48:53 CET 2011


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.



More information about the R-help mailing list