Flextable按列分组

3

我正在使用Rmarkdown生成报告,需要能够呈现为Word格式。我希望能够重现这个表格格式:

enter image description here

我尝试使用flextable实现,但没有取得任何进展。我已经阅读了flextable网站,并找到了一种使用组合来合并行的方法,但不知道如何对列进行分组。

as_grouped_data()函数可以事先创建组,但我能否将这些组用作列标题呢?

我的数据的一个简单示例:

df = structure(list(Athlete = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 
1L, 1L, 1L, 2L, 2L, 2L), .Label = c("Athlete 1", "Athlete 2"), class = "factor"), 
    Time = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
    2L, 3L), .Label = c("1", "2", "3"), class = "factor"), Measure = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Distance", 
    "Speed"), class = "factor"), Value = c(4.02, 11.5, 19.82, 
    3.03, 9.67, 17.9, 6.5, 8.08, 8.47, 5.3, 7.64, 8.67)), row.names = c(NA, 
-12L), class = "data.frame")

# Create table
myft = flextable(df) 
# Merge athlete column
myft = merge_v(myft, j=c("Time", "Athlete"))
myft

我被卡在这里,不确定如何将这些分组从行标题转换为列标题。


1
不确定您是否已经查看了这些示例 - akrun
我确实尝试过那些@akrun!但是我无法让它与我的数据集一起工作。我仍在学习编程,但认为答案可能就在其中某个地方。 - vb66
1个回答

4
为了创建你想要的表格格式,你可能想要将数据“宽”化。这将为两位运动员提供2列。此示例使用 tidyr 中的 pivot_wider
在按时间顺序排列后,您可以使用 flextable 中的 merge_v。在合并后添加 fix_border_issues 以修复底部表格边框。
library(flextable)
library(tidyverse)

myft <- df %>%
  pivot_wider(id_cols = c(Time, Measure), names_from = Athlete, values_from = Value) %>%
  arrange(Time) %>%
  flextable()

# Merge Time column vertically
myft = merge_v(myft, j="Time")
myft = fix_border_issues(myft, part = "all")
myft

输出

合并垂直列的flextable


1
太好了,谢谢!我总是不确定长数据或宽数据哪个更好。显然在这种情况下是宽数据更好。再次感谢。 - vb66

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