'How to vectorise ifelse function in R?
I am trying to make a vectorized function using ifelse in R, but my code is only taking the first element of the vector. For example, as shown in my code below when I assigned "y" to the Years argument, the code instead of giving a vector output, only gave the result of the first element.
Can somebody tell me how can I vectorize the output?
salaryCAl2 <- function(Years=1, Department){
ifelse(Department=="Sales",Years * 10000 * 1.2,
ifelse(Department == "Data", Years*12000*1.3, Years*13000*1.15))
}
y <- c(2,3)
salaryCAl2(y, "HR")
Solution 1:[1]
You can use switch
which is vectorized and is usually a better alternative for nested ifelse statements to handle different cases.
salaryCAl2 <- function(Years = 1, Department) {
switch(
Department,
"Sales" = Years * 10000 * 1.2,
"Data" = Years * 12000 * 1.3,
Years * 13000 * 1.15
)
}
y <- c(2,3)
salaryCAl2(y, "HR")
# [1] 29900 44850
Solution 2:[2]
Your function can be vectorized in many ways. One way is to create a function that calculates the salary for a single year, and the salaryCal2
apply this function to each year of the Years
data.
salaryCAl2a<- function(Years=1, Department){
single_year_cal <- function(ayear){
ifelse(Department=="Sales",ayear * 10000 * 1.2,
ifelse(Department == "Data", ayear*12000*1.3, ayear*13000*1.15))
}
unlist(lapply(Years, single_year_cal))
}
salaryCAl2a(y, "HR")
#[1] 29900 44850
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Merijn van Tilborg |
Solution 2 | Abdur Rohman |