如何从kable()函数中对表格中的名称进行下标处理?

12

给定一个数据框A,我如何使用下标行和列名?最终我想通过kable()在rmarkdown中生成一个表格(输出:Word文档)。

A <- data.frame(round(replicate(3, runif(2)),2))
rownames(A) <- c("Hola123", "Hola234")
A

          X1   X2   X3
Hola123 0.47 0.55 0.66
Hola234 0.89 0.45 0.20

当我通过kable(A)创建表格时,如何使所有行和列名称中的数字都成为下标?

我尝试过:

rownames(A) <- c(expression(Hola["123"]), expression(Hola["234"]))
names(A) <- c(expression(X["1"]), expression(X["2"]), expression(X["3"]))

但在.rmd文件中通过kable()创建表格时,它并不会以下标的形式出现。

3个回答

13

在 rmarkdown 文档中添加下标,你可以在两个波浪号之间嵌入文本:text~sub~。 当使用函数 kable 时,表格中的任何文本都会被识别为 markdown 语法。因此,你的 rmarkdown 代码应该是:

```{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)
```

9
这花费了我一些时间来理解,所以以防有人希望将此用于使用“latex”表格的“pdf”输出:您不能在“latex”表格中使用“markdown”语法!您需要做的是在“kable()”中添加“escape = F”,然后使用“latex”语法,如“\texsubscript{ }”(注意额外的“/”),例如:“Hola\texsubscript{123}”。 - bamphe
5
如下所示,正如Rubem所指出的那样,这个拼写错误了:使用\\textsubscript{123}。这只是给未来读者的一个提示,就像我一样,阅读了“tex”,然后停止了进一步阅读,认为这对LaTeX命令很有意义。 - DuckPyjamas
感谢您提供有用的答案。顺便说一下,上标是“^文本^”。 - Clem Snide

6

关于bamphe的回答,需要注意的是正确的代码拼写有误。应该是\\textsubscript{},第二个“t”被省略了。

另外,为了完成答案,您可以选择在kable内使用参数row.namescol.names,如下所示:

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)

2
请注意,表格中包含特殊字符(&%$#_{ }〜^ \ )的数据和名称需要使用\\进行转义。如果您使用正则表达式进行转义,则还需要在正则表达式中转义斜杠,因此最终代码类似于str_replace_all(str,"","\\")`。 - DuckPyjamas

2

我也在寻找一种方法,能够在markdown表格中使用kable使得下标上标html和pdf格式中都可用。经过一番搜索,我终于发现了@yihui-xie在这里解释的文本引用方法:bookdownguide

(ref:foo) H~2~O其中foo是引用,H~2~O是文本。

我的代码示例展示了如何使用文本引用。请确保遵循以下基本规则:

  1. 引用在整个文档中需要唯一
  2. 引用后不应有空格
  3. 引用需要位于自己的段落中,并且在上方和下方都有空行

请注意,只有引用的 "foo" 和 "fo" 才会给出下标,而 ~[]~ 方法只能在html中工作而不能在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"))```

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接