Multiple conditional statements within lapply function to avoid looping

I would like to write a function with multiple conditions within lapply. I know how to define multiple conditions using a for loop. However I would like to avoid looping this time.

For instance:

let’s assume there is a vector (vctr) with numbers from -3 to 5:

set.seed(10)
vctr <- c(sample(-3:5), rep(0,3), sample(-3:5), 0)

and let’s define two conditions:

  • condition_1 <- if the number is equal to 0 -> add 1 to the initial
    value
  • condition_2 <- if the number is not equal to 0 -> leave it be

And this works perfectly fine:

test_list <- lapply(1:length(vctr), function(x) if(vctr[x]==0) vctr[x] +1 else vctr[x])

However, what about the situation in which there would be multiple conditions? For instance:

  • condition_1 <- if the number is equal to 0 -> add 1
  • condition_2 <- if the number is negative -> replace it with absolute value
  • condition_3 <- if the number is greater than 0 but lower than 3 ->
    add 2 to the initial value
  • condition_4 <- if the number is equal or greater than 3 -> leave it be

I tried the following with conditions 1, 2 and "leave it be" however this syntax does not work.

test_list2 <- lapply(1:length(vctr), function(x) if(vctr[x]==0) vctr[x] +1 if else(vctr[x]<0) abs(vctr[x]) else vctr[x])

EDIT: I would like to ask for non-dplyr solutions.

>Solution :

you can replace sapply with lapply if you want a list output

sapply(vctr, function(x) {
  if (x == 0) y <- x + 1
  if (x < 0) y <- abs(x)
  if (x > 0 & x < 3) y <- x + 2
  if (x >= 3) y <- x
  return(y)
})

[1] 5 2 1 4 1 3 3 3 4 1 1 1 3 2 4 3 1 5 1 3 4 1

Leave a Reply