如何在R的gt包中正确使用gt_plt_sparkline生成迷你折线图?
解决gt包中gt_plt_sparkline生成折线图的问题
问题原因分析
你遇到的两种方法都存在list列生成错误的问题:
- 第一种方法
list(data[1,3:5])是将第一行的月份数据向量包装成单个list元素,mutate会把这个元素重复到所有行,导致所有折线图都显示第一组数据。 - 第二种方法
data[row(data),3:5]返回的是整个月份数据的完整数据框,list()将其作为单个元素赋值给每一行,gt_plt_sparkline无法处理这种嵌套数据框的结构,因此抛出类型转换错误。
正确解决方案
要为每行生成独立的迷你折线图,需要为每行创建一个包含对应月份数据的数值向量list元素,以下是几种可行的实现方式:
方法1:使用dplyr的rowwise + c_across
这是最直观的tidy风格写法:
library(gt) library(gtExtras) library(dplyr) df <- data.frame( group = c("x", "x", "y", "y", "z", "z"), sub_group = c("1", "2", "1", "2", "1", "2"), jan = c(1, 2, 3, 3, 4, 1), feb = c(2, 3, 1, 3, 2, 4), mar = c(9, 2, 5, 3, 1, 4) ) df %>% rowwise() %>% # 按行提取jan到mar的数值,包装成list mutate(summary = list(c_across(jan:mar))) %>% ungroup() %>% gt() %>% # 指定折线图列 gt_plt_sparkline(column = summary)
方法2:使用base R的apply
如果偏好base R写法,可以用apply按行处理:
df$summary <- apply(df[, c("jan", "feb", "mar")], 1, function(x) list(x)) df %>% gt() %>% gt_plt_sparkline(column = summary)
方法3:使用purrr的pmap
借助purrr包的pmap函数,按行组合月份列:
library(purrr) df %>% mutate(summary = pmap(list(jan, feb, mar), c)) %>% gt() %>% gt_plt_sparkline(column = summary)
优化表格显示
如果需要隐藏原始月份列并添加自定义标签,可以这样调整:
df %>% rowwise() %>% mutate(summary = list(c_across(jan:mar))) %>% ungroup() %>% # 只保留分组列和折线图列 select(group, sub_group, summary) %>% gt() %>% gt_plt_sparkline(column = summary) %>% # 为折线图列设置友好标签 cols_label(summary = "1-3月数据趋势")
内容的提问来源于stack exchange,提问作者pimaniye41
相关产品推荐
相关产品推荐

