How can I subscript names in a table from kable()?

To add subscripts in a rmarkdown document, you can embed your text between two tilde: text~sub~. When using function kable, any text in the table is recognized as markdown syntax. So that your rmarkdown code should be:

```{r}
A <- data.frame(round(replicate(3, runif(2)),2))
rownames(A) <- c("Hola~123~", "Hola~234~")
names(A) <- c("X~1~", "X~2~", "X~3~")
knitr::kable(A)
```

I, too, was looking for a method that would allow for subscript and superscript in both html and pdf formats in markdown tables with kable. After a bit of searching, I finally found the text reference method explained here by @yihui-xie : bookdownguide

(ref:foo) H~2~O where foo is the reference and H~2~O the text.

My code example shows how the text reference can be used. Make sure to follow the cardinal rules:

  1. The reference needs to be unique throughout the document
  2. The reference should not have a white space following the "to be inserted stuff"
  3. The reference needs to be in its own paragraph and have an empty line both above and below it

Note that only the referenced "foo" and "fo" will give the subscripts while the ~[]~ method will only work in html but not pdf.


(ref:foo) CO~2~/CO~2~

(ref:fo) CO~2~


```{r chunk-to-show-the-text-reference-method, echo = FALSE }
library(dplyr)
library(knitr)
library(kableExtra)

# Make lists
dtmin_name <- c("ref/ref","refrigerant/CO2","(ref:foo)",paste0("ground/","(ref:fo)"),"ground/water","air/refrigerant","water/refrigerant","water/CO2")
temp_diff <- c( 2.3, 1.4, 0.8, 6.8, 14, 6, 4, 3.46)

# Make dataframe and column names
dtmin_df <- data.frame(dtmin_name,temp_diff, stringsAsFactors = FALSE)
colnames <- data.frame("Interface Type ", "dT~min~ Interval [K]", stringsAsFactors = FALSE)
colnames(dtmin_df) <- colnames

# Make Table
kable(dtmin_df, caption = "Typical dT~min~ Temperature Intervals", booktabs = TRUE, format.args = list(big.mark = ",")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),latex_options = c("striped","scale_down"))```

Just one note about bamphe's response is that the correct code is misspelled. It should be \\textsubscript{}. It is missing the second "t".

And completing the answer, you might choose to use the arguments row.names and col.names inside kable, in this way:

A <- data.frame(round(replicate(3, runif(2)),2))

rownames(A) <- c("Hola\\textsubscript{123}", "Hola\\textsubscript{234}")

knitr::kable(A,
             row.names = T,
             col.names = c("X\\textsubscript{1}", "X\\textsubscript{2}", "X\\textsubscript{3}"),
             escape = F)