我正在try 基于数据框中的数据聚合来标记我的facet_WRAP标题.

我正在编写一个函数来绘制不同的数据集,所以我使用一个函数参数来 Select 我想要分面的列.在本例中,我希望为broad中的每个唯一类创建刻面,但希望刻面标签包含每个broad类别的所有percBackground个值的总和.

我试过使用Rlang {{}},但几乎没有成功(或理解).


data.test <- data.frame(broad = c("A", "A", "A", "B", "B", "C", "C", "C", "C"),
                        detail = c("a", "b", "c", "d", "e", "f", "g", "h", "i"),
                        sr.Summer = c(12, 23, 32, 12, 12, 11, 14, 15, 18),
                        percBackground = c(1.5, 4.3, 3.4, 4.6, 3.4, 4.1, 3.9, 2.9, 1.8))

func.test <- function(data, facet.by){
  
  aggr <- data %>% aggregate(percBackground ~ facet.by, FUN = sum) %>%
    mutate(label = paste0(facet.by, " - ", round(percBackground, digits = 2), "%"))
  
  facet_label <- aggr$label
  names(facet_label) <- unique(facet_label)
  
  ggplot(data = data, aes(x = detail)) +
    geom_point(aes(y = sr.Summer)) +
    facet_wrap(~facet.by, labeller = labeller(facet.by = facet_label))
  
}

func.test(data = data.test, 
          facet.by = broad)

> Error in eval(predvars, data, env) : object 'broad' not found

     13. eval(predvars, data, env)
     12. eval(predvars, data, env)
     11. model.frame.default(formula = by, data = x)
     10. stats::model.frame(formula = by, data = x)
     9. eval(m, parent.frame())
     8. eval(m, parent.frame())
     7. aggregate.formula(x = by, data = x, FUN = FUN, ...)
     6. aggregate.data.frame(., percBackground ~ facet.by, FUN = sum)
     5. aggregate(., percBackground ~ facet.by, FUN = sum)
     4. aggregate(., percBackground ~ facet.by, FUN = sum)
     3. mutate(., label = paste0(facet.by, " - ", round(percBackground,
        digits = 2), "%"))
     2. data %>% aggregate(percBackground ~ facet.by, FUN = sum) %>%
        mutate(label = paste0(facet.by, " - ", round(percBackground,
        digits = 2), "%"))
     1. func.test(data.test, broad)


推荐答案

使用{{的一个问题是,它不适用于aggregate,即切换到dplyr::summarise.其次,当在facet_wrap中使用curl -curl {{时,你必须在vars()中换行.第三,为了获得刻面标签的命名向量,我使用tibble::deframe,最后,为了通过labeller传递赋值标签,我将其传递给.cols参数(.rows对于facet_wrap也可以很好地工作:

library(ggplot2)
library(dplyr, warn = FALSE)

func.test <- function(data, facet.by) {
  aggr <- data %>%
    summarise(percBackground = sum(percBackground), .by = {{ facet.by }}) %>%
    mutate(label = paste0({{ facet.by }}, " - ", round(percBackground, digits = 2), "%"))

  facet_label <- aggr |> 
    select({{ facet.by }}, label) |> 
    tibble::deframe()

  ggplot(data = data, aes(x = broad)) +
    stat_summary(fun = "mean", geom = "point", aes(y = sr.Summer)) +
    facet_wrap(vars({{ facet.by }}), labeller = labeller(.cols = facet_label))
}

func.test(
  data = data.test,
  facet.by = broad
)

enter image description here

第二个选项是向数据集中添加一个新列,您可以将其命名为facet或其他名称,这样就可以对大部分代码执行标准计算.这样做之后,您可以在其余代码中使用此名称,而无需使用{{vars().rows:

func.test <- function(data, facet.by) {
  data <- data |> 
    mutate(facet = {{facet.by}})
  
  aggr <- data %>%
    summarise(percBackground = sum(percBackground), .by = facet) %>%
    mutate(label = paste0(facet, " - ", round(percBackground, digits = 2), "%"))
  
  facet_label <- aggr |> 
    select(facet, label) |> 
    tibble::deframe()
  
  ggplot(data = data, aes(x = broad)) +
    stat_summary(fun = "mean", geom = "point", aes(y = sr.Summer)) +
    facet_wrap(~facet, labeller = labeller(facet = facet_label))
}

func.test(
  data = data.test,
  facet.by = broad
)

R相关问答推荐

使用case_when和Mutate搜索多个列以寻找条件

查找满足SpatRaster中条件的单元格位置

如何在ggplot 2线性图的每个方面显示每个组的误差条?

ggplot geom_smooth()用于线性回归虚拟变量-没有回归线

如何对数据集进行逆向工程?

大规模重新标记haven标签数据

在连续尺度上转置标签[瀑布图,R]

如果可能,将数字列转换为整数,否则保留为数字

R中1到n_1,2到n_2,…,n到n_n的所有组合都是列表中的向量?

从圆到R中的多边形的标绘雷达图

更改STAT_VALLES/STAT_PEAKS中的箭头线宽/大小

如何将使用rhandsontable呈现的表值格式化为百分比,同时保留并显示完整的小数精度?

有没有可能用shiny 的书签恢复手风琴面板?

我将工作代码重构为一个函数--现在我想不出如何传递轴列参数

以不同于绘图中元素的方式对GG图图例进行排序

计算使一组输入值最小化的a、b和c的值

我需要使用ggplot2制作堆叠条形图

如何调整一个facet_work()面板内的框图和移动标签之间的水平宽度?

在不重复主题的情况下重新排列组

如何计算多个变量的百分比与总和的百分比?