Search code examples
rflextable

highlight cell if previous column meets specific condition R


I have a dataframe

library(flextable)
df = structure(list(col1 = c(1, NA, 1, 1, 1), col2 = c(NA, 1, NA, 
1, 1), col3 = c(1, 1, NA, 1, NA), col4 = c(1, 1, 1, 1, NA)), class = "data.frame", row.names = c(NA, 
-5L))
df %>% flextable()

I want

enter image description here

to return the last 3 columns highlighted based on the following logic:

  • red if it is blank
  • green if and only if the preceeding column was blank.

Based on this, I am trying to create a color matrix to identify the green highlights, but have hit a brick wall.

To identify the red matrix, I used the following code ifelse(is.na(df),"red","").

what would be the best method to identify the green labels


Solution

  • Not the prettiest, but works

    df=data.frame(col1 = c(1,NA,1,1,1,1),
                  col2 = c(NA,1,NA,1,1,1), 
                  col3 = c(1,1,NA,1, NA,1),
                  col4 = c(1,1,1,1,NA,1))
    df %>% flextable()
    red = ifelse(is.na(df),1,0)
    green = data.frame()
    for(n in 1:(ncol(red)-1)){
      print(n)
      r=ifelse(red[,n]==1 & red[,n+1] == 0,1,0)
      green = rbind(green, r)
    }
    green = t(green)
    colnames(green) = paste0("col",2:4)
    green
    red[,2:4]
    ft = df[,2:4] %>% 
      flextable() %>%
      bg(i = ~ is.na(col2), j = 1,bg='red') %>%
      bg(i = ~ is.na(col3), j = 2,bg='red') %>%
      bg(i = ~ is.na(col4), j = 3,bg='red') %>%
      bg(i = ~ green[,1]==1,j = 1, bg='green') %>%
      bg(i = ~ green[,2]==1,j = 2, bg='green') %>%
      bg(i = ~ green[,3]==1,j = 3, bg='green')
    ft  
    

    enter image description here