首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在具有R中多个标头行的可挠性表中设置标头标签?

如何在具有R中多个标头行的可挠性表中设置标头标签?
EN

Stack Overflow用户
提问于 2019-12-16 13:45:13
回答 1查看 3.9K关注 0票数 2

我正在使用R中的可弯曲函数来创建一个漂亮的平面应急表。我的平面应急表有两行列标题。我试图使用可弯曲包中的set_header_labels-function来更改这些内容,但是失败了。

下面的步骤代表了我所经历的过程。前五步进展顺利。在最后一步中,我没有达到我想要的结果,我想要将列标题名从"A“更改为"aa”,从"B“更改为"bb”。请注意,在一开始将"A“改为"aa”等并不能解决我的问题。我真的需要做我想要的改变,在最后,而不是在开始!

  1. 创建一个tibble。

代码语言:javascript
运行
复制
t <- tibble(ID = 1:10, 
header1 = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"),
header2 = c("No", "No", "No", "Yes", "Yes", "Yes", "Yes", "No", "Yes", "No"),
q1 = c(1, 3, 2, 2, 3, 1, 2, 1, 1, 3))

  1. 创建一个平面应急表。

ft <- (t %>% ftable(row.vars = c("q1"), col.vars = c("header1", "header2")))

  1. 加载该函数以将平面应急表转换为可弯曲的表。来源:Is there an (easy) way to convert flat contingency tables (ftable) to flextable

代码语言:javascript
运行
复制
ftable_to_flextable <- function( x ){

  row.vars = attr( x, "row.vars" )
  col.vars = attr( x, "col.vars" )
  rows <- rev(expand.grid( rev(row.vars), stringsAsFactors = FALSE ))
  cols <- rev(expand.grid( rev(col.vars), stringsAsFactors = FALSE ))

  xmat <- as.matrix(x)
  cols$col_keys = dimnames(xmat)[[2]]
  xdata <- cbind(
    data.frame(rows, stringsAsFactors = FALSE),
    data.frame(xmat, stringsAsFactors = FALSE)
  )
  names(xdata) <- c(names(row.vars), cols$col_keys)

  ft <- regulartable(xdata)
  ft <- set_header_df(ft, cols)
  ft <- theme_booktabs(ft)
  ft <- merge_v(ft, j = names(row.vars))
  ft
}

  1. 创建了一个可伸缩的.

flext <- ftable_to_flextable(ft)

  1. 合并两个标题。

代码语言:javascript
运行
复制
flext <- merge_at(flext, i = 1, j = 2:3, part = "header")
flext <- merge_at(flext, i = 1, j = 4:5, part = "header")

运行flext现在返回:

  1. 现在,我希望更改平面应急表第一个标题行中的两个标签。

set_header_labels(flext, A = "aa", B = "bb")

我收到以下错误消息:

代码语言:javascript
运行
复制
Error in `[<-`(`*tmp*`, i, j, value = value) : subscript out of bounds
EN

回答 1

Stack Overflow用户

发布于 2019-12-16 21:04:56

这将完成您的代码的工作。

代码语言:javascript
运行
复制
# flext <- flextable::compose(flext, i = 1, j = 2, part = "header", value = as_paragraph("aa"))
# flext <- flextable::compose(flext, i = 1, j = 4, part = "header", value = as_paragraph("bb"))

如果这有帮助,我将使用泛型as_flextable来实现它。

代码语言:javascript
运行
复制
library(flextable)

dat <- data.frame(
  ID = 1:10,
  header1 = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"),
  header2 = c("No", "No", "No", "Yes", "Yes", "Yes", "Yes", "No", "Yes", "No"),
  q1 = c(1, 3, 2, 2, 3, 1, 2, 1, 1, 3), 
  stringsAsFactors = FALSE
)

dat$header1 <- factor(dat$header1, levels = c("A", "B"), labels = c("aa", "bb"))
dat$header2 <- factor(dat$header2, levels = c("No", "Yes"), labels = c("nope", "ok"))
ft <- ftable(dat,
  row.vars = c("q1"),
  col.vars = c("header1", "header2")
)


as_flextable.ftable <- function(x, ...) {
  row.vars <- attr(x, "row.vars")
  col.vars <- attr(x, "col.vars")
  rows <- rev(expand.grid(rev(row.vars), stringsAsFactors = FALSE))
  cols <- rev(expand.grid(rev(col.vars), stringsAsFactors = FALSE))

  xmat <- as.matrix(x)
  cols$col_keys <- dimnames(xmat)[[2]]
  xdata <- cbind(
    data.frame(rows, stringsAsFactors = FALSE),
    data.frame(xmat, stringsAsFactors = FALSE)
  )
  names(xdata) <- c(names(row.vars), cols$col_keys)

  ft <- flextable(xdata)
  ft <- set_header_df(ft, cols)
  ft <- theme_booktabs(ft)
  ft <- merge_h(ft, i = seq_len(ncol(rows)), part = "header")
  ft
}

as_flextable(ft)

这可能需要额外的工作,但没有那么多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59357908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档