我想知道为什么当检索不存在的行名时两个数据框会产生不同的结果a。b例如,
a <- as.data.frame(matrix(1:3, ncol = 1, nrow = 3, dimnames = list(c("A1", "A10", "B"), "V1")))
a
V1
A1 1
A10 2
B 3
b <- as.data.frame(matrix(4:5, ncol = 1, nrow = 2, dimnames = list(c("A10", "B"), "V1")))
b
V1
A10 4
B 5
Run Code Online (Sandbox Code Playgroud)
让我们尝试从数据框中获取“A10”、“A1”、“A” a:
> a["A10", 1]
[1] 2
> a["A1", 1]
[1] 1 # expected
> a["A", 1]
[1] NA # expected
> a["B", 1]
[1] 3 # expected
> a["C", 1] …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 r markdown、kable 和 kableExtra 输出乳胶表。当我使用选项 row.names=FALSE 而不是 row.names=TRUE 时,乳胶代码会生成 \vphantom 代码,这会产生创建 pdf 的错误。看来问题与 row_spec 选项有关。
这是 Rmarkdown 代码(.Rmd 文件):
---
title: "Test"
output:
pdf_document:
fig_caption: true
keep_tex: true
---
{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
{r}
library(knitr)
library(kableExtra)
temp <- mtcars[1:5,1:5]
kable(temp, format = "latex", booktabs = F,row.names=F) %>%
kable_styling(position = "center") %>%
row_spec(1, bold = T, background = "red")
Run Code Online (Sandbox Code Playgroud)
错误是:
!扫描 \check@nocorr@ 时发现禁止的控制序列。\par l.105 ...颜色{红色} \textbf{21.0 &\vphantom{1} 6} & \textbf{160} & \textbf{...
怎么了?
我注意到,如果数据帧的行名称遵循从 1 到行数的数字序列。使用 后,数据框的行名称将消失as.matrix。但如果行名称不是序列,则行名称会重新出现。
这是一个可重现的示例:
test <- as.data.frame(list(x=c(0.1, 0.1, 1), y=c(0.1, 0.2, 0.3)))
rownames(test)
# [1] "1" "2" "3"
rownames(as.matrix(test))
# NULL
rownames(as.matrix(test[c(1, 3), ]))
# [1] "1" "3"
Run Code Online (Sandbox Code Playgroud)
为什么会出现这种情况?
mtcars显然有行名称:
> head(mtcars)\n mpg cyl disp hp drat wt qsec vs am gear carb\nMazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4\nMazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4\nDatsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1\nHornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1\nHornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2\nValiant 18.1 6 …Run Code Online (Sandbox Code Playgroud)