[R] Need help figuring out sapply (and similar functions) with multiple parameter user defined function

PIKAL Petr petr.pikal at precheza.cz
Fri Dec 6 17:30:54 CET 2013


Hi

So first step is over. Anyway, is there any problem with using dput as I suggested?

Instead of using your date I need to generate my own.

A<-sample(0:2, 10, replace=T)
B<-sample(0:2, 10, replace=T)
C<-sample(0:2, 10, replace=T)
df<-data.frame(A,B,C)

df[df[,2]==2,2]<-3
df$C<-as.numeric(as.character(factor(df$C, labels=c(0,2,3))))

df
   A B C
1  0 3 3
2  0 1 2
3  0 3 2
4  1 0 3
5  1 0 3
6  2 3 2
7  1 3 2
8  2 3 3
9  1 1 0
10 0 0 3

> -----Original Message-----
> From: Walter Anderson [mailto:wandrson01 at gmail.com]
> Sent: Friday, December 06, 2013 5:11 PM
> To: PIKAL Petr; r-help at r-project.org
> Subject: Re: [R] Need help figuring out sapply (and similar functions)
> with multiple parameter user defined function
> 
> 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

Instead of those tricky ifs (uff uff) you can use either of these

df[df[,2]==2,2]<-3
df$C<-as.numeric(as.character(factor(df$C, labels=c(0,2,3))))

df
   A B C
1  0 3 3
2  0 1 2
3  0 3 2
4  1 0 3
5  1 0 3
6  2 3 2
7  1 3 2
8  2 3 3
9  1 1 0
10 0 0 3

And here I am lost again.

Please, can you clearly state the way how do you want to choose preferences based on values in those three columns.

Regards
Petr

> 
> 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-bounces at r-project.org [mailto:r-help-bounces at r-
> >> project.org] On Behalf Of Walter Anderson
> >> Sent: Friday, December 06, 2013 4:44 PM
> >> To: r-help at 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 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.



More information about the R-help mailing list