Search code examples
rcharacter

Skipping a line of code when a condition is met in R


I am trying to skip a line of code based on a condition. Here my sample dataset looks like.

df <- data.frame(
  id = c(12,25,31,47),
  b = c("cat.1","cat.2","cat.3","cat.2"),
  drop = c(FALSE,TRUE,TRUE,TRUE))

> df
  id     b  drop
1 12 cat.1 FALSE
2 25 cat.2  TRUE
3 31 cat.3  TRUE
4 47 cat.2  TRUE

Based on the b and drop variables, I print different out and combine them in the output. I would like to skip a line code when drop = FALSE.

output <- c()
for(i in 1:nrow(df)) {
  if (df$b[i] == "cat.1") {
    out <- paste0("Item_first_",df$id[i],"_",df$drop[i])
    
  } else if(df$b[i] == "cat.2") { 
    out <- paste0("Item_second_",df$id[i],"_",df$drop[i])
    
  } else {
    out <- paste0("Item_others_",df$id[i],"_",df$drop[i])
  }
  output <- c(output, out) 
}

print(output)
[1] "Item_first_12_FALSE" "Item_second_25_TRUE" "Item_others_31_TRUE" "Item_second_47_TRUE"

In this case, "Item_first_12_FALSE" needs to be dropped from the output because this row in the dataset has the drop=FALSE.

I know there is next function in for() loops but it avoids the whole iteration. And also, it looks easy to fix by just removing the FALSE from the dataset but I specifically want to omit it inside of the ifelse because of the other condition combinations. IN this case, I need only skip this part meeting the drop=`FALSE' condition.

 if (df$b[i] == "cat.1") {
    out <- paste0("Item_first_",df$id[i],"_",df$drop[i])
    
  }

The desired output would be:

"Item_second_25_TRUE" "Item_others_31_TRUE" "Item_second_47_TRUE"

Solution

  • Try wrapping your if-else within another if statement:

    output <- c()
    for(i in 1:nrow(df)) {
      if (df$drop[i] == T) {
        if (df$b[i] == "cat.1") {
          out <- paste0("Item_first_",df$id[i],"_",df$drop[i])
          
        } else if(df$b[i] == "cat.2") { 
          out <- paste0("Item_second_",df$id[i],"_",df$drop[i])
          
        } else {
          out <- paste0("Item_others_",df$id[i],"_",df$drop[i])
        }
        output <- c(output, out)
      }  
    }
    
    > print(output)
    [1] "Item_second_25_TRUE" "Item_others_31_TRUE" "Item_second_47_TRUE"