1

I would like to use opt_footnote_marks to label a column according to another column as follows:

# packages
library("gt")
library("data.table")

# generate sample data.table
DT <- data.table(var1 = c(1:7),
                 p.value = c(0.7142599356, 0.0516123439, 0.0004532802, 0.1129728328, 0.3334458362, 0.3849460248, 0.0241492332))

# use gt to generate a gt_tib object
gt.table <- gt(data = DT) 

# label var1 according to p.value
gt.table <- 
  tab_footnote(
    data      = gt.table,       
    footnote  = "a",      
    locations = cells_body(
      columns = var1, 
      rows    = p.value >= 0.05 & p.value < 0.1)) %>%         
  tab_footnote(
    data      = .,
    footnote  = "b",
    locations = cells_body(
      columns = var1,
      rows    = p.value >= 0.01 & p.value < 0.05)) %>%
  tab_footnote(
    data      = .,
    footnote  = "c",
    locations = cells_body(
      columns = var1,
      rows    = p.value < 0.01)) %>%
  opt_footnote_marks(
    data      = .,
    marks     = c("*", "**", "***")) 

# print table as html
gt.table

However, the result was very wired. As the picture showed: First, the order of the footnote "a", "b" and "c" was not correct. Second, a row with p.value < 0.01 should be labeled with ***. In the picture, it only had **. Thank you!

result.1

After I tried @Matt's solution by adjusting the order of the footnote, (I added a comment at the line where the adjustment was made)

# generate test data.table
DT <- data.table(var1 = c(1:7),
                 var1.p.value = c(0.7142599356, 0.0516123439, 0.0004532802, 0.1129728328, 0.3334458362, 0.3849460248, 0.0241492332),
                 var2 = c(8:14),
                 var2.p.value = c(0.0696197928, 0.0440874454, 0.1603414690, 0.0007604622, 0.2863551953, 0.1418785028, 0.3724698668))

# change data.table to gt_tib object 
gt.table <- gt(data = DT) 

# add footnote by looping
for(x in c("var1")){
  
  gt.table <- 
  tab_footnote(
    data      = gt.table,       
    footnote  = "a",      
    locations = cells_body(
      columns = x, 
      rows    = DT[[paste0(x, ".p.value")]] >= 0.05 & DT[[paste0(x, ".p.value")]] < 0.1)) %>%         
  tab_footnote(
    data      = .,
    footnote  = "b",
    locations = cells_body(
      columns = x,
      rows    = DT[[paste0(x, ".p.value")]] >= 0.01 & DT[[paste0(x, ".p.value")]] < 0.05)) %>%
  tab_footnote(
    data      = .,
    footnote  = "c",
    locations = cells_body(
      columns = x,
      rows    = DT[[paste0(x, ".p.value")]] < 0.01)) %>%
  opt_footnote_marks(
    data      = .,
    marks     = c("*", "***", "**")) # change mark order according to the present of the wanted row in the column.  
}
gt.table 

As shown in result.2, var1 with var1.p.value < 0.01 were labeled with *** and var1 with 0.01 <= var1.p.value < 0.05 were labeled with **. But when I tried to do the same job to two columns, the correlation between labels and p.value changed again. result.3 As shown here, var1 or var2 with p.value < 0.01 were labeled with ** and 0.01 <= p.value < 0.05 were labeled with ***. Thanks again!

Ian Wang
  • 135
  • 8

1 Answers1

0

The order of the footnotes appear as they are first present in your column. First a on row 2, then c on row 3, and b on row 7.

If you switch your labels, they will appear as you intend:

gt.table <- 
  tab_footnote(
    data      = gt.table,       
    footnote  = "a",      
    locations = cells_body(
      columns = var1, 
      rows    = p.value >= 0.05 & p.value < 0.1)) %>%         
  tab_footnote(
    data      = .,
    footnote  = "c",
    locations = cells_body(
      columns = var1,
      rows    = p.value >= 0.01 & p.value < 0.05)) %>%
  tab_footnote(
    data      = .,
    footnote  = "b",
    locations = cells_body(
      columns = var1,
      rows    = p.value < 0.01)) %>%
  opt_footnote_marks(
    data      = .,
    marks     = c("*", "**", "***")) 

Matt
  • 7,255
  • 2
  • 12
  • 34
  • 1
    Thank you for the answer. It worked! But the same problem emerged after I use a loop to add footnote to several columns. I edited my question to illustrate this problem. – Ian Wang Nov 06 '21 at 03:05
  • 1
    I think I might have figured it out. As you suggested, the order of the footnotes appear as they are first present in one column. However, when there are more than one column, the order of the footnotes appear as they are first present in row across every columns. That is, the function first check table[1,1] then table[1,2] then table[1,3]. That explained why the order of footnotes changed when I increased columns in the loop. – Ian Wang Nov 06 '21 at 06:44