如何将希腊字母显示为矩阵的行名称?

7

我想知道如何在R中设置矩阵的行名,包括希腊字母表达式。我使用了“expression”,但好像没起作用。以下是我的代码。

b.summary = matrix(0, 8, 6)
colnames(b.summary)= c("Min.", "1st Qu.", "Median", "Mean","3rd Qu", "Max." )
rownames(b.summary)= c(expression(paste(tau, "=1", sep="")),expression(paste(sigma^2, "=1", sep="")), expression(paste(tau, "=5",sep="")), expression(paste(sigma^2, "=0.2",sep="")), expression(paste(tau, "=16", sep="")), expression(paste(sigma^2, "=0.0625",sep="")), expression(paste(tau, "1/2.25", sep="")),expression( paste(sigma^2, "=2.25", sep="")) )

当我键入 b.summary 时,显示的行名如下:
paste(tau, "=1", sep = "")

使用希腊字母的原因是我正在使用knitr创建动态文档。我想直接显示此矩阵的结果,而不是手动创建一个表格并使用\Sexpr{}表达式键入矩阵的所有元素。在knitr中的完整代码块如下:

而不是LaTeX表达式。

<<coverage.b.summary, eval=TRUE, echo=FALSE>>=
 b.summary = matrix(runif(48), 8, 6)
 colnames(b.summary)= c("Min.", "1st Qu.", "Median", "Mean","3rd Qu", "Max." )
rownames(b.summary)= labels(expression(paste(tau, "=1",     sep="")),expression(paste(sigma^2, "=1", sep="")), expression(paste(tau, "=5",sep="")), expression(paste(sigma^2, "=0.2",sep="")), expression(paste(tau, "=16", sep="")), expression(paste(sigma^2, "=0.0625",sep="")), expression(paste(tau, "=1/2.25", sep="")),expression( paste(sigma^2, "=2.25", sep="")) )
b.summary
@

Thank you advance for your help!


我不确定如何表示类似sigma平方这样的东西,但是这个问题的被接受答案可能在很大程度上有所帮助。 - nrussell
使用矩阵对象有严格的限制之一是行名称为字符向量,这些表达式将被强制转换为字符向量。最好的做法是解释此努力的目标,然后找到一个不那么受限制的数据结构。原生R中没有LaTex表示的概念,因此您需要提前考虑此数据对象将用于哪种用途。此外,其plotmath形式中的paste函数没有'sep'参数。 - IRTFM
我明白了!非常感谢您提供的信息和建议。那么,我将解释一下这个努力的目标! - Crystal
那么我认为你应该使用paste(而不是expression)来构建行名本身,你应该使用@nrussell提供的提示来生成希腊字母。 - IRTFM
2个回答

6

在使用矩阵的限制下,这是我所能做到的最好的。行名称不能是R表达式类对象。我正在构建一个名为“希腊字母”的命名向量,并使用名称从中提取Unicode值,然后使用参数循环将交替行标记为tau和sigma^2。(无法使用表达式意味着无法在矩阵行名称中使用下标。)

greeks=c(alpha='\u03b1', tau='\u03c4', sigma='\u03c3',
                         beta='\u03b2',
                         gamma='\u03b3')

b.summary = matrix(0, 8, 6)
colnames(b.summary)= c("Min.", "1st Qu.", "Median", "Mean","3rd Qu", "Max." )
rownames(b.summary)= paste0(c( greeks['tau'], paste0(greeks['sigma'],"^2") ), 
                               c("=1","=1", "=5", "=0.2",
                                 "=16",  "=0.0625", "=2.25", "=2.25") )

> b.summary
           Min. 1st Qu. Median Mean 3rd Qu Max.
τ=1           0       0      0    0      0    0
σ^2=1         0       0      0    0      0    0
τ=5           0       0      0    0      0    0
σ^2=0.2       0       0      0    0      0    0
τ=16          0       0      0    0      0    0
σ^2=0.0625    0       0      0    0      0    0
τ=2.25        0       0      0    0      0    0
σ^2=2.25      0       0      0    0      0    0

2
调整@42- 的解决方案(这应该是一个评论,但是答案有更好的代码格式):
greeks = c(alpha='\u03b1', tau='\u03c4', sigma='\u03c3', sigmaSq='\u03c3\u00B2', beta='\u03b2', gamma='\u03b3')
b.summary = matrix(0, 8, 6)
colnames(b.summary) = c("Min.", "1st Qu.", "Median", "Mean","3rd Qu", "Max.")
p1 = c(greeks['tau'], greeks['sigmaSq'])
p2 = c("1","1", "5", "0.2", "16",  "0.0625", "2.25", "2.25")
rownames(b.summary) = paste(p1, p2, sep="=")
b.summary

生成以下内容。
          Min. 1st Qu. Median Mean 3rd Qu Max.
τ=1          0       0      0    0      0    0
σ²=1         0       0      0    0      0    0
τ=5          0       0      0    0      0    0
σ²=0.2       0       0      0    0      0    0
τ=16         0       0      0    0      0    0
σ²=0.0625    0       0      0    0      0    0
τ=2.25       0       0      0    0      0    0
σ²=2.25      0       0      0    0      0    0

在我的特定用例中,我正在使用KnitR为mtcars数据集创建一个方差膨胀因子和标准差膨胀因子的“kable”:

cars.vif = rbind(
    t(vif(cars.model)[,1]),
    t(sqrt(vif(cars.model))[,1])
)
rownames(cars.vif) = c("\u03c3", "\u03c3\u00B2")
kable(cars.vif)

带希腊符号和上标的行名

想要实现这个功能需要使用xelatex并安装包含 σ 字符的字体,例如Arial


3
另一种选择:对于LaTeX输出和kable的情况,可以使用LaTeX语法来设置行名/列名: colnames(cars) <- c("$\\nu$", "$\\delta$");knitr::kable(cars, escape = FALSE) - CL.

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