Search code examples
rfor-looplevels

Relevel many variables with given different reference level using for loop in r


I need to change the reference level for a, b, d, and e variables. The reference level should be 3 for variable a and 2 for variable b, d and e. This can be done separately. But want to do at once or using for loop. Following is the code that I have written. But, showed an error message "'relevel' only for (unordered) factors".

tr <- data.frame(a = c(3, 2, 3, 3, 1), b = c(4, 3, 2, 2, 1), c = c(1, 2, 3, 2, 1),
                 d = c(1, 3, 1, 2, 2), e = c(1, 2, 0, 1, 2))

#convert to factor type
tr <- tr %>% mutate_if(is.numeric, as.factor)

# Relevel factors
col_set <- list(1, c(2, 4, 5))  # column index to relevel
r <- c("3", "2")      # referencing level

for (i in seq_along(col_set)){
  tr[col_set[[i]]] <- relevel(tr[col_set[[i]]], r[i])
}

**Error in relevel.default(tr[col_set[[i]]], r[i]) : 
  'relevel' only for (unordered) factors**

Solution

  • Instead of the for loops you can use Map to use relevel on specific columns.

    tr[unlist(col_set)] <- Map(relevel, tr[unlist(col_set)], rep(r, lengths(col_set)))
    str(tr)
    #'data.frame':   5 obs. of  5 variables:
    # $ a: Factor w/ 3 levels "3","1","2": 1 3 1 1 2
    # $ b: Factor w/ 4 levels "2","1","3","4": 4 3 1 1 2
    # $ c: Factor w/ 3 levels "1","2","3": 1 2 3 2 1
    # $ d: Factor w/ 3 levels "2","1","3": 2 3 2 1 1
    # $ e: Factor w/ 3 levels "2","0","1": 3 1 2 3 1