Thank you for your response!

I am attempting to determine a preference from the answers to three binomial questions;

q.1) 1 or 2    q.2) 1 or 3    q.3) 2 or 3

However, the questions are coded with either a 1 or 2 (though no answer is also possible) and the first three functions (q#.ans) convert those values to the 1,2,or 3 shown above

and generate one of the following result for each row of the table; 0 - no preference, or 1,2,3 which indicates the preference indicated by the question

The if's implement the following state conditions:

  # ID A  B  C  Preference
  # 1  0  0  0  None
  # 2  0  0  1  None
  # 3  0  0  2  None
  # 4  0  1  0  None
  # 5  0  1  1  Option 1
  # 6  0  1  2  None
  # 7  0  2  0  None
  # 8  0  2  1  None
  # 9  0  2  2  Option 2
  # 10 1  0  0  None
  # 11 1  0  1  Option 1
  # 12 1  0  2  None
  # 13 1  1  0  Option 1
  # 14 1  1  1  Option 1
  # 15 1  1  2  Option 1
  # 16 1  2  0  None
  # 17 1  2  1  Option 1
  # 18 1  2  2  Option 2
  # 19 2  0  0  None
  # 20 2  0  1  None
  # 21 2  0  2  Option 2
  # 22 2  1  0  None
  # 23 2  1  1  Option 1
  # 24 2  1  2  Option 2
  # 25 2  2  0  Option 2
  # 26 2  2  1  Option 2
  # 27 2  2  2  Option 2

The if statement only implements those values from the state machine that show a preference (ID's 5,9,11,13-15,17-18,21,23-27)

On 12/06/2013 09:59 AM, PIKAL Petr wrote:
Hi

The warning is due to fact that "if" takes only single scalar value not an 
entire vector.

Maybe you shall explain more clearly what result do you expect.

I bet that there is vectorised solution to your problem but I am lost in your 
ifs and cannot follow what shall be the output.

Please use

dput(head(df))

when showing input data and clearly describe intended result.

Regards
Petr


-----Original Message-----
From: r-help-boun...@r-project.org [mailto:r-help-bounces@r-
project.org] On Behalf Of Walter Anderson
Sent: Friday, December 06, 2013 4:44 PM
To: r-help@r-project.org
Subject: [R] Need help figuring out sapply (and similar functions) with
multiple parameter user defined function

I am having trouble understanding how to use sapply (or similar
functions) with a user defined function with multiple parameters.

I have the following functions defined

     q1.ans <- function(x)
     {
        retVal = 0
        if (x == 1) {
          retVal = 1
        } else if (x ==2) {
          retVal = 2
        }
        return (retVal)
     }
     q2.ans <- function(x)
     {
        retVal = 0
        if (x == 1) {
          retVal = 1
        } else if (x ==2) {
          retVal = 3
        }
        return (retVal)
     }
     q3.ans <- function(x)
     {
        retVal = 0
        if (x == 1) {
          retVal = 2
        } else if (x ==2) {
          retVal = 3
        }
        return (retVal)
     }

     evaluate.questions <- function(q.1,q.2,q.3)
     {
        a <- q1.ans(q.1)
        b <- q2.ans(q.2)
        c <- q3.ans(q.3)
        retVal = 0   # Set default value to be no preference
        # The following code only implements those values from the state
     machine that show a preference (ID's 5,9,11,13-15,17-18,21,23-27)
        if (a == 0) {
          if (b == 1) {
            if (c == 1) {
              retVal = 1  # State machine ID 5
            }
          } else if (b == 2) {
            if (c == 2) {
              retVal = 2  # State machine ID 9
            }
          }
        } else if (a == 1) {
          if (b == 0) {
            if (c == 1) {
              retVal = 1  # State machine ID 11
            }
          } else if (b == 1) {
            retVal = 1    # State machine ID's 13-15, value of C doesn't
     matter
          } else if (b == 2) {
            if (c == 1) {
              retVal = 1  # State machine ID 17
            } else if (c == 2) {
              retVal = 2  # State machine ID 18
            }
          }
        } else if (a == 2) {
          if (b == 0) {
            if (c == 2) {
              retVal = 2  # State machine ID 21
            }
          } else if (b == 1) {
            if (c == 1) {
              retVal = 1  # State machine ID 23
            } else if (c == 2) {
              retVal = 2  # State machine ID 24
            }
          } else if (b == 2) {
            retVal = 2    # State machine ID's 25-27, value of C doesn't
     matter
          }
        }
        return (retVal)
     }

And a data set that looks like this:

     ID,Q1,Q2,Q3
     1,2,2,2
     2,2,1,1
     3,1,1,1
     4,1,2,2
     5,2,2,1
     6,1,2,1
     ...


I have been researching and it appears that I should be using the
sapply function to apply the evaluate.question function above to each
row in the data frame like this

preferences <- sapply(df, evaluate.questions, function(x,y,z)
evaluate.questions(df['Q1'],df['Q2'],df['Q3']))

Unfortunately this doesn't work and the problem appears that the sapply
function is not feeding the parameters to the evaluate.questions
function as I expect.  Can someone provide some guidance on what I am
doing wrong?

This is the error message I am getting:

Error in x --1 :
    Comparison (1) is possible only for atomic and list types In
addition: warning messages:
In if (x == 1) { :
    the condition has length > 1 and only the first element will be used

        [[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.

______________________________________________
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.

Reply via email to