[英]How to flexibly add header row names in flextable in R?
我正在嘗試制作一個根據用戶輸入自動生成靈活表的功能,並且我希望標題盡可能不重復。 例如,當前列名是:
raw_names <- c("name", "V1_avg", "V1_median", "V2_avg", "V2_median", "V3_avg", "V3_median")
對於此表,我希望頂部標題具有變量名稱(V1、V2、V3),而子標題在相應變量下方為 Avg 和 Med。 頂部標題中不會有任何名稱(請參見下面的代碼)
如果我要手動明確說明,我知道如何執行此操作,但我希望此功能靈活,因為有時數據集可能具有 V4 或 V5。 輸入將始終如上所示,但它可能具有不同數量的變量。
讓我感到困惑的是,對於這些主要標題,您需要指定標題行的長度,但我不確定會有多少變量:
library(flextable)
add_header_row(colwidths = c(1, 2, 2, 2),
values = c(NA_character_, "V1", "V2", "V3"))
有什么想法嗎?
如果您的raw_names
將始終遵循相同的模式,也許像這樣准備add_header_row()
參數:
col_widths_vect <- function(names_vect) c(1, rep(2, (length(names_vect) - 1) / 2))
col_vals_vect <- function(names_vect) {
return(
c(
NA_character_,
names_vect[2:length(names_vect)] |>
sub("_.*", "", x = _) |>
unique()
)
)
}
raw_names <- c("name", "V1_avg", "V1_median", "V2_avg", "V2_median", "V3_avg", "V3_median")
col_widths_vect(raw_names)
#> [1] 1 2 2 2
col_vals_vect(raw_names)
#> [1] NA "V1" "V2" "V3"
我創建了一個名為separate_header
的函數(目前僅在 github 上可用)。 它使用data.table::tstrsplit()
來做你想做的事情。
x <- data.frame(
Species = as.factor(c("setosa", "versicolor", "virginica")),
Sepal.Length_mean = c(5.006, 5.936, 6.588),
Sepal.Length_sd = c(0.35249, 0.51617, 0.63588),
Sepal.Width_mean = c(3.428, 2.77, 2.974),
Sepal.Width_sd = c(0.37906, 0.3138, 0.3225),
Petal.Length_mean = c(1.462, 4.26, 5.552),
Petal.Length_sd = c(0.17366, 0.46991, 0.55189),
Petal.Width_mean = c(0.246, 1.326, 2.026),
Petal.Width_sd = c(0.10539, 0.19775, 0.27465)
)
ft_1 <- flextable(x)
ft_1 <- colformat_double(ft_1, digits = 2)
ft_1 <- theme_box(ft_1)
ft_1 <- separate_header(
x = ft_1,
opts = c("span-top", "bottom-vspan")
)
ft_1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.