In a previous post, we looked at If/Else statements in R. We developed a function that calculated the amount of money James and the owner would give based on how many points the team scored. Below is a copy of this function.
CashDonate <- function(points, Dollars_per_point=40, HomeGame=TRUE){ game.points<- points * Dollars_per_point if(points > 100) {game.points <-points * 30} if(HomeGame) {Total.Donation <- game.points * 1.5 } else {Total.Donation <- game.points * 1.3} round(Total.Donation) }
There is one small problem with this function. Currently, you have to input each game one at a time. You can have R calculate the results of several games at once. For example, look at the results of the code below when we try to input more than one game at once.
> CashDonate(c(99,100,78)) [1] 5940 6000 4680 Warning message: In if (points > 100) { : the condition has length > 1 and only the first element will be used
As you can see, we get a warning message and some of the values are wrong. For example, the second value should be 4,500 and not 6,000.
In order to deal with this problem, R has the ‘ifelse’ function available. The ‘ifelse’ allows R to choose values in two or more vectors to complete an action. We need to be able to choose the appropriate action based on the following information
- points scored is less than or greater than 100
- Home game or not a home game
Remember, R could do this if one value was put into the ‘CashDonate’ function. Now we need to be able to calculate what to do based on several values in each of the vectors above. Below is the modified code for doing this.
CashDonate <- function(points, HomeGame=TRUE){ JamesDonate<- points * ifelse(points > 100, 30, 40) totalDonation<- JamesDonate * ifelse(HomeGame, 1.5, 1.3) round(totalDonation) }
Here is what the modified function does
- It has the argument ‘points’ and the default argument of ‘HomeGame = TRUE’
- The first calculation is the number of points but with the ‘ifelse’ function. If the number of points is greater than 100 the points is multiplied by 30 if less than 100 than the points are multiplied by 40. All this is put in the variable ‘JamesDonate’
- Next, the amount from ‘JamesDonate’ is multiplied by 1.5 if it was a home game or 1.3 if it was not a home game. All this is put into the variable ‘totalDonation’
- The results are rounded
To use CashDonate to its full potential you need to make a dataframe. Below is the code for the ‘games’ data frame we will use.
games<- data.frame(game.points=c(88,100,99,111,96), HomeGame=c(TRUE, FALSE, FALSE, TRUE, FALSE))
In the ‘games’ data frame we have two columns, one for game points and another that tells us if it was a home game or not. Now we will use the ‘games’ data frame with the new ‘CashDonate’ and calculate the results. We need to use the ‘with’ function to do this. This function will be explained at a later date. Below are the results.
> with(games, CashDonate(game.points, HomeGame=HomeGame)) [1] 5280 5200 5148 4995 4992
You can calculate this manually if you would like. Now, we can calculate more than one value in are ‘CashDonate’ function which makes it much more useful than before. All thanks to the use of the ‘ifelse’ function in the code.
Pingback: Switch Function in R | educationalresearchtechniques
Pingback: Logical Flow in R: If/Else Statements Part II |...