我必须生成具有很长表的数据列表,这些表必须显示在几页上,并且我想折叠一些行(例如ID)。
我正在使用包kable
来生成表,并使用collapse_row
函数来折叠我的ID行。
当我编织成pdf时,列中具有折叠行的对齐方式完全混乱了,甚至我的ID都出现在表外或重复出现的标题中……
这是我的代码:
kable(data, "latex", booktabs = T,longtable = T, linesep = "", row.names = FALSE) %>%
kable_styling(full_width = T,
position = "center",
latex_options = c("striped", "repeat_header","hold_position"),
font_size = 6,5)%>%
column_spec(c(1), color = "black", width = "5em")%>%
column_spec(c(2), color = "black", width = "30em")%>%
collapse_rows(1, latex_hline = "custom",valign = "top")%>%
row_spec(0, bold = T, color = "black")
这是我的pdf输出的样子:
我该如何解决? 谢谢。
答案 0 :(得分:1)
看起来像是LaTeX问题,表格中的垂直对齐方式。
有关github问题的引言:
[...]似乎书本的cmidrule弄乱了multirow的计算。
[...]我不知道是否可以找到一个好的解决方案。我当然可以删除那些中线。我也不喜欢它们,但是它们对于具有多个标题列的表很重要。如果我们保留这些中线,TeX员工会说您可以手动将调整添加到多行。我当然可以通过代码来模拟它,但将来似乎会给我带来更多问题。
来源:https://github.com/haozhu233/kableExtra/issues/56
其他参考:
This solution在遇到相同问题的情况下效果很好。该解决方案基于在输出到kable之前对data.frame进行操作,而不是使用crash_rows更改kable的输出。原始贡献者(Michael Harper)开发了它以便与formattable包一起使用,但是可以很容易地为kable包进行调整。
您需要声明此函数:
collapse_rows_df <- function(df, variable){
group_var <- enquo(variable)
df %>%
group_by(!! group_var) %>%
mutate(groupRow = 1:n()) %>%
ungroup() %>%
mutate(!!quo_name(group_var) := ifelse(groupRow == 1, as.character(!! group_var), "")) %>%
select(-c(groupRow))
}
该函数将除去指定列中除第一次遇到的所有数据,而留空白。
您需要先调用该函数,然后再将数据发送到kable。请参见下面的示例:
library(knitr) # required for kable()
# dfToKable - your data.frame you need to kable
# columnToCollapseRows - the name of the column, in which you want to collapse the rows;
# it should be a valid variable within the data.frame set and be passed without quotes
kable( collapse_rows_df( dfToKable, columnToCollapseRows ),
row.names = F, escape = F, longtable = TRUE) %>%
kable_styling(full_width = T, latex_options = c("repeat_header"))
根据您提供的代码和屏幕截图,这应该适合您:
kable( collapse_rows_df( data, SubID) "latex", booktabs = T,longtable = T, linesep = "", row.names = FALSE) %>%
kable_styling(full_width = T,
position = "center",
latex_options = c("striped", "repeat_header","hold_position"),
font_size = 6,5)%>%
column_spec(c(1), color = "black", width = "5em")%>%
column_spec(c(2), color = "black", width = "30em")%>%
row_spec(0, bold = T, color = "black")