SCI高分秘籍:R语言绘制三线表

文摘   2024-09-23 22:13   德国  

SCI高分秘籍:掌握三线表,让你的论文脱颖而出!

在SCI科研论文中,图表是展示数据的关键元素,而三线表更是其中的经典代表之一。它不仅能清晰、简洁地传递信息,还能让你的数据展示更加专业、易读。

那么,究竟什么是三线表?如何在论文中高效运用?今天就带你深入了解,助力你的科研写作!

什么是三线表?

三线表,又称三横线表,是一种简洁明了的表格设计方式,它仅用三条水平线来区分表格内容:

  1. 顶线:位于表格的最上方,用来区分表头和正文。
  2. 中线:位于表头和数据内容之间,起到分隔表头与数据的作用。
  3. 底线:位于表格的最下方,标记表格的结束。

三线表的优势

  • 视觉简洁:减少冗余线条,让数据更加直观、整洁,阅读体验佳。
  • 符合国际标准:三线表被广泛应用于高水平SCI期刊,使用这种格式能让你的论文更符合学术规范。
  • 数据突出:精简的设计让数据成为表格的绝对主角,避免其他元素的干扰。

接下来我们正式进入绘制图表的部分吧!

一、你好!三线表

三线表的设计原则是去除冗余,避免过多的线条让数据显得杂乱无章。这种简洁的布局特别适合展示实验结果、统计数据等,能够帮助读者迅速抓住核心信息。

下面我们将展示一个经典的三线表应用案例,快速对比数值差异。通过三线表,我们能够清晰地看到数据的显著变化,无冗余元素干扰。

二、开始画图啦!

数据展示

pacman::p_load(
 rio,            # import/export
 here,           # file pathways
 flextable,      # make HTML tables 
 officer,        # helper functions for tables
 tidyverse)      # data management, summary, and visualization

导入R包

library(tidyr)
library(dplyr)

导入数据

linelist <- import("linelist_cleaned.rds")

数据预处理

table <- linelist %>% 
  # 获得每个医院病人不同结局组的总数
  ###############################################
  group_by(hospital, outcome) %>%                      # Group data
  summarise(                                           # Create new summary columns of indicators of interest
    N = n(),                                            # Number of rows per hospital-outcome group     
    ct_value = median(ct_blood, na.rm=T)) %>%           # median CT value per group
  ############
  bind_rows(                                           # Bind the previous table with this mini-table of totals
  linelist %>% 
    filter(!is.na(outcome) & hospital != "Missing") %>%
    group_by(outcome) %>%                            # Grouped only by outcome, not by hospital    
    summarise(
      N = n(),                                       # Number of rows for whole dataset     
      ct_value = median(ct_blood, na.rm=T))) %>%     # Median CT for whole dataset

转换数据为宽数据

 mutate(hospital = replace_na(hospital, "Total")) %>% 
  pivot_wider(                                         # Pivot from long to wide
    values_from = c(ct_value, N),                       # new values are from ct and count columns
    names_from = outcome) %>%                           # new column names are from outcomes
  mutate(                                              # Add new columns
    N_Known = N_Death + N_Recover,                               # number with known outcome
    Pct_Death = scales::percent(N_Death / N_Known, 0.1),         # percent cases who died (to 1 decimal)
    Pct_Recover = scales::percent(N_Recover / N_Known, 0.1)) %>% # percent who recovered (to 1 decimal)
  select(                                              # Re-order columns
    hospital, N_Known,                                   # Intro columns
    N_Recover, Pct_Recover, ct_value_Recover,            # Recovered columns
    N_Death, Pct_Death, ct_value_Death)  %>%             # Death columns
  arrange(N_Known)                                    # Arrange rows from lowest to highest (Total row at bottom)

table

创建基础三线表

my_table <- flextable(table) 
my_table
图一.基础三线表

列宽调整

S# autofit()函数可以很好地展开表格,使每个单元格只有一行文本
my_table %>% autofit()

# 我们也可以使用qflextable()快速实现上述效果:
qflextable(table)

# 自定义列宽:
my_table <- my_table %>% 
  width(j=1, width = 2.7) %>% 
  width(j=2, width = 1.5) %>% 
  width(j=c(4,5,7,8), width = 1)

my_table
图二.列宽调整

设置列标题

my_table <- my_table %>% 
  # 添加标题行:
  add_header_row(
    top = TRUE,                # New header goes on top of existing header row
    values = c("Hospital",     # Header values for each column below
               "Total cases with known outcome"
               "Recovered",    # This will be the top-level header for this and two next columns
               "",
               "",
               "Died",         # This will be the top-level header for this and two next columns
               "",             # Leave blank, as it will be merged with "Died"
               "")) %>% 
  # 设置标题行的标签:
  set_header_labels(
    hospital = ""
    N_Known = "",                  
    N_Recover = "Total",
    Pct_Recover = "% of cases",
    ct_value_Recover = "Median CT values",
    N_Death = "Total",
    Pct_Death = "% of cases",
    ct_value_Death = "Median CT values")  %>% 
  
  merge_at(i = 1, j = 3:5, part = "header") %>% # Horizontally merge columns 3 to 5 in new header row
  merge_at(i = 1, j = 6:8, part = "header")     # Horizontally merge columns 6 to 8 in new header row

my_table

图三.设置列标题

边框和背景

# 定义线的颜色和宽度等:
border_style = officer::fp_border(color="black", width=1)

# 加框线:
my_table <- my_table %>% 
  # 移除所有框线:
  border_remove() %>%  
  # 通过已有的主题设置添加水平线
  theme_booktabs() %>% 
  # 添加竖线分开恢复和死亡部分
  vline(part = "all", j = 2, border = border_style) %>%   # at column 2 
  vline(part = "all", j = 5, border = border_style)       # at column 5

my_table
图四。边框和背景

字体和对齐

my_table <- my_table %>% 
  flextable::align(align = "center", j = c(2:8), part = "all") %>% 
  # 调整列标题字体:
  fontsize(i = 1, size = 12, part = "header") %>%   
  # 调整列标题的font face:
  bold(i = 1, bold = TRUE, part = "header") %>%   
  # 此外,也可以指定调整第7行的字体:
  bold(i = 7, bold = TRUE, part = "body")           

my_table
图五.字体和对齐

合并单元格

my_table <- my_table %>% 
  merge_at(i = 1:2, j = 1, part = "header") %>% 
  merge_at(i = 1:2, j = 2, part = "header")

my_table
图六.合并单元格

背景设置

my_table <- my_table %>% 
  bg(part = "body"bg = "gray95")  

my_table 
图七.背景设置

条件格式

my_table %>% 
  bg(j = 7, i = ~ Pct_Death >= 55, part = "body"bg = "red"

my_table %>% 
  bg(., i= ~ hospital == "Military Hospital", part = "body"bg = "#91c293"

图八.条件格式

扩展

本次绘图我们用到了两个特别重要的R包。加深对两个包的了解,能够让我们清楚数据处理的细节。现在让我们来了解一下它们吧!

tidyr包

tidyr包专注于数据的整理和重塑,它提供了一系列方便的函数,帮助用户将数据整理成更适合分析和建模的格式。tidyr的核心功能是数据的长宽格式转换,以及数据的拆分和合并。

tidyr包的主要功能

  • 长宽格式转换:
    • gather():将宽格式数据转换为长格式数据。宽格式数据通常指每个观测对象的不同变量占据不同的列,而长格式数据则指每个观测对象的不同变量占据不同的行。gather()函数通过指定key和value两个新列,将原始数据框中的所有列转换为长格式。
    • spread():与gather()相反,将长格式数据转换回宽格式数据。通过指定key和value列,spread()函数将长格式数据中的重复行合并成宽格式的一行。数据拆分和合并:
    • separate():将一个列中的值拆分为多个列。这通常用于处理那些包含多个信息字段(如日期、时间、地址等)的单一列。
    • unite():将多个列合并为一个列。与separate()相反,该函数通过将多个列的值连接起来生成一个新的列。
  • 缺失值处理:tidyr还提供了处理缺失值的函数,如drop_na()用于删除包含缺失值的行,fill()用于填充缺失值等。

tidyr包的使用场景

tidyr包非常适合用于数据预处理阶段,特别是在需要将数据从一种格式转换为另一种格式,或者需要对数据进行拆分和合并以便进一步分析时。

dplyr包

dplyr包是R语言中用于数据操作的强大工具,它提供了一套简洁而强大的函数集,方便用户对数据进行筛选、排序、汇总等操作。

dplyr包的主要功能

  • 数据筛选:filter():根据给定的逻辑条件筛选数据框中的行。

  • 数据排序:arrange():根据给定的列名或表达式对行进行排序。

  • 数据选择:select():选择数据框中的特定列。

  • 数据变形:mutate():添加新列或对现有列进行变换。

  • 数据汇总:summarise():对数据框中的行进行汇总操作,生成新的统计量。常与group_by()函数结合使用,以实现对分组数据的汇总。

  • 数据连接:inner_join()left_join()right_join()等:根据两个数据框的公共列将它们连接起来。

dplyr包的使用场景

dplyr包适用于数据分析的各个阶段,特别是在需要对数据进行复杂操作(如筛选、排序、分组汇总等)时。其简洁的语法和高效的处理速度使得dplyr成为R语言用户进行数据操作的首选工具之一。

总的来说,tidyrdplyr是R语言中两个不可或缺的数据处理包。它们提供了丰富的函数集和灵活的数据操作方式,使得用户能够轻松地进行数据清洗、整理和分析工作。

本文作者:杨硕龄


现在:


长按扫码关注:科研生信充电宝


10元赞赏本文,即喜欢作者~


即可直接解锁:


《跟着高分SCI学画图:R语言绘制三线表》对应资源哦~


看到这里你还不心动吗?


赶紧关注、转发、点赞、分享,领取你的专属福利吧~



好啦,以上就是今天推文的全部内容啦!


版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本公众号不拥有所有权,也不承担相关法律责任。

如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:kysxcdb@163.com 进行举报,一经查实,本公众号将立刻删除涉嫌侵权内容。



科研生信充电宝
介绍科研;介绍统计;介绍生信;
 最新文章