[R] help understanding why #function(x, y) (if((x-y)=0) {2^(x-y)} else{-(2^abs(x-y))})# doesn't work like I think it should
Hello R users and developers, I am trying to write several functions (fairly new at this) in order to avoid using loops on large data frames (because they are slow). I wrote the function below and it seems to get hung on the first part of the if statement and then applies that condition to rest of the function. So if (x-y) is greater than 0 the function uses the true statement for the calculations. Could someone please offer some advise on how to write these functions a little better or a type apply that I may use with two (or more) different vectors of data required by a single functions. ### Examples ### ## example 1 ### x-c(5,6,4,3,5,3,1) y-c(1,6,2,1,7,1,9) folds-function(x,y) (if((x-y)=0) {2^(x-y)} else{-(2^abs(x-y))}) z-folds(x,y) check-cbind(x,y,z) View(check) Warning message: In if ((x - y) = 0) { : the condition has length 1 and only the first element will be used ### why will it only use the first element and how to I get around this ## example 2 making the fist comparison negative ### x1-c(5,6,4,3,5,3,1) y1-c(11,6,2,1,7,1,9) folds-function(x,y) (if((x-y)=0) {2^(x-y)} else{-(2^abs(x-y))}) z1-folds(x1,y1) check2-cbind(x1,y1,z1) View(check2) Warning message: In if ((x - y) = 0) { : the condition has length 1 and only the first element will be used loop I am trying to avoid writing many many times # folds2-NULL xy-as.data.frame(cbind(x,y)) for (i in 1:nrow(xy)) { diff-xy$x[i]-xy$y[i] folds2[i]-if(diff=0) {2^diff} else{-(2^abs(diff))} } xyz-cbind(xy,folds2) View(xyz) # Thank you, Alan P.S. why does ?function not work __ 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.
Re: [R] help understanding why #function(x, y) (if((x-y)=0) {2^(x-y)} else{-(2^abs(x-y))})# doesn't work like I think it should
Use ifelse() rather than if () {} else {}. It's vectorized and very useful for applying to elements along vectors. The latter idiom is much better for control of flow in programs and functions. folds - function (x, y) ifelse(x-y = 0, 2^(x-y), -(2^abs(x-y))) z - folds(x, y) z [1] 16144 -44 -256 ?function works for me. Here's my setup: R version 2.7.0 (2008-04-22) x86_64-pc-linux-gnu Cheers, Simon. On Tue, 2008-06-03 at 20:47 -0500, ALAN SMITH wrote: Hello R users and developers, I am trying to write several functions (fairly new at this) in order to avoid using loops on large data frames (because they are slow). I wrote the function below and it seems to get hung on the first part of the if statement and then applies that condition to rest of the function. So if (x-y) is greater than 0 the function uses the true statement for the calculations. Could someone please offer some advise on how to write these functions a little better or a type apply that I may use with two (or more) different vectors of data required by a single functions. ### Examples ### ## example 1 ### x-c(5,6,4,3,5,3,1) y-c(1,6,2,1,7,1,9) folds-function(x,y) (if((x-y)=0) {2^(x-y)} else{-(2^abs(x-y))}) z-folds(x,y) check-cbind(x,y,z) View(check) Warning message: In if ((x - y) = 0) { : the condition has length 1 and only the first element will be used ### why will it only use the first element and how to I get around this ## example 2 making the fist comparison negative ### x1-c(5,6,4,3,5,3,1) y1-c(11,6,2,1,7,1,9) folds-function(x,y) (if((x-y)=0) {2^(x-y)} else{-(2^abs(x-y))}) z1-folds(x1,y1) check2-cbind(x1,y1,z1) View(check2) Warning message: In if ((x - y) = 0) { : the condition has length 1 and only the first element will be used loop I am trying to avoid writing many many times # folds2-NULL xy-as.data.frame(cbind(x,y)) for (i in 1:nrow(xy)) { diff-xy$x[i]-xy$y[i] folds2[i]-if(diff=0) {2^diff} else{-(2^abs(diff))} } xyz-cbind(xy,folds2) View(xyz) # Thank you, Alan P.S. why does ?function not work __ 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. -- Simon Blomberg, BSc (Hons), PhD, MAppStat. Lecturer and Consultant Statistician Faculty of Biological and Chemical Sciences The University of Queensland St. Lucia Queensland 4072 Australia Room 320 Goddard Building (8) T: +61 7 3365 2506 http://www.uq.edu.au/~uqsblomb email: S.Blomberg1_at_uq.edu.au Policies: 1. I will NOT analyse your data for you. 2. Your deadline is your problem. The combination of some data and an aching desire for an answer does not ensure that a reasonable answer can be extracted from a given body of data. - John Tukey. __ 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.
Re: [R] help understanding why #function(x, y) (if((x-y)=0) {2^(x-y)} else{-(2^abs(x-y))})# doesn't work like I think it should
Alan - ALAN SMITH wrote: Hello R users and developers, I am trying to write several functions (fairly new at this) in order to avoid using loops on large data frames (because they are slow). I wrote the function below and it seems to get hung on the first part of the if statement and then applies that condition to rest of the function. So if (x-y) is greater than 0 the function uses the true statement for the calculations. Could someone please offer some advise on how to write these functions a little better or a type apply that I may use with two (or more) different vectors of data required by a single functions. ### Examples ### ## example 1 ### x-c(5,6,4,3,5,3,1) y-c(1,6,2,1,7,1,9) folds-function(x,y) (if((x-y)=0) {2^(x-y)} else{-(2^abs(x-y))}) z-folds(x,y) check-cbind(x,y,z) View(check) Warning message: In if ((x - y) = 0) { : the condition has length 1 and only the first element will be used ### why will it only use the first element and how to I get around this When learning R, you have the power of the interpreter at all times. You have defined x and y above to be numeric vectors of length 7 each. Try typign x - y at the interpreter, and you'll see you get another numeric vector of length 7. Now try (x - y) = 0 , and you'll get a logical vector of length 7. However, if does not want a logical vector of length 7, it wants a logical vector of length 1, see the 'cond' argument of ?if. However, the ifelse function should do what you want, see ?ifelse. Here's an example using it folds2 - function(x, y) { ifelse(x - y = 0, 2^(x - y), -(2^abs(x - y))) } folds2(x, y) should give you your answer... ## example 2 making the fist comparison negative ### x1-c(5,6,4,3,5,3,1) y1-c(11,6,2,1,7,1,9) folds-function(x,y) (if((x-y)=0) {2^(x-y)} else{-(2^abs(x-y))}) z1-folds(x1,y1) check2-cbind(x1,y1,z1) View(check2) Warning message: In if ((x - y) = 0) { : the condition has length 1 and only the first element will be used Same idea as above here... loop I am trying to avoid writing many many times # folds2-NULL xy-as.data.frame(cbind(x,y)) for (i in 1:nrow(xy)) { diff-xy$x[i]-xy$y[i] folds2[i]-if(diff=0) {2^diff} else{-(2^abs(diff))} } xyz-cbind(xy,folds2) View(xyz) # I'm not exactly sure what you'd like here, but hopefully with the above you can figure it out. Let me know if you have any questions! Best, Erik Iverson Thank you, Alan P.S. why does ?function not work What do you expect it to do? It shows the help page for 'function' here. __ 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.
Re: [R] help understanding why #function(x, y) (if((x-y)=0) {2^(x-y)} else{-(2^abs(x-y))})# doesn't work like I think it should
Try this: data.frame(x, y, folds = (x == y) + sign(x - y) * 2 ^ abs(x - y)) or replace data.frame with cbind if you prefer a matrix result. On Tue, Jun 3, 2008 at 9:47 PM, ALAN SMITH [EMAIL PROTECTED] wrote: Hello R users and developers, I am trying to write several functions (fairly new at this) in order to avoid using loops on large data frames (because they are slow). I wrote the function below and it seems to get hung on the first part of the if statement and then applies that condition to rest of the function. So if (x-y) is greater than 0 the function uses the true statement for the calculations. Could someone please offer some advise on how to write these functions a little better or a type apply that I may use with two (or more) different vectors of data required by a single functions. ### Examples ### ## example 1 ### x-c(5,6,4,3,5,3,1) y-c(1,6,2,1,7,1,9) folds-function(x,y) (if((x-y)=0) {2^(x-y)} else{-(2^abs(x-y))}) z-folds(x,y) check-cbind(x,y,z) View(check) Warning message: In if ((x - y) = 0) { : the condition has length 1 and only the first element will be used ### why will it only use the first element and how to I get around this ## example 2 making the fist comparison negative ### x1-c(5,6,4,3,5,3,1) y1-c(11,6,2,1,7,1,9) folds-function(x,y) (if((x-y)=0) {2^(x-y)} else{-(2^abs(x-y))}) z1-folds(x1,y1) check2-cbind(x1,y1,z1) View(check2) Warning message: In if ((x - y) = 0) { : the condition has length 1 and only the first element will be used loop I am trying to avoid writing many many times # folds2-NULL xy-as.data.frame(cbind(x,y)) for (i in 1:nrow(xy)) { diff-xy$x[i]-xy$y[i] folds2[i]-if(diff=0) {2^diff} else{-(2^abs(diff))} } xyz-cbind(xy,folds2) View(xyz) # Thank you, Alan P.S. why does ?function not work __ 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.