【问题标题】:R ggpubr use global environment objects?R ggpubr 使用全局环境对象?
【发布时间】:2019-12-16 06:13:27
【问题描述】:

我想使用 ggpubr 包来引用在我的全局环境中的字符串中列出的数据框列名,但 ggpubr 似乎不接受变量,只接受硬编码的列名。有没有办法我可以进行任何更改以便它可以做到这一点?

vars = c('var1', 'var2')
controls = c('a', 'w')

df = data.frame(subject = 1:100,
                value = rnorm(100, 100, 10),
                var1 = rep(c('a', 'b'), 50),
                var2 = rep(c('w', 'x', 'y', 'z'), 25))

library(ggpubr)

compare_means(value ~ vars, df, ref.group = 'a')

但我希望能够用 var[1]、var[2] 等替换“vars”,对于 ref.group = controls[1]、controls[2] 也是如此。我可以让 ggpubr 引用全局环境对象,而不是直接将输入作为列名吗?

【问题讨论】:

  • 使用公式接口,您大概可以将公式构建为字符串并在其上使用as.formulamy_form = as.formula(paste(vars[1], vars[2], sep = "~")),然后是 compare_means(my_form, df, ref.group = 'a')。从未使用过ggpubr,因此未经测试。

标签: r environment-variables ggpubr


【解决方案1】:

我们可以使用reformulate

library(ggpubr)
fml <- reformulate(vars[1], 'value')
compare_means(fml , df, ref.group = controls[1])
# A tibble: 1 x 8
#  .y.   group1 group2     p p.adj p.format p.signif method  
#  <chr> <chr>  <chr>  <dbl> <dbl> <chr>    <chr>    <chr>   
#1 value a      b      0.537  0.54 0.54     ns       Wilcoxon

对于使用对应值的多个元素,请使用Map from base R

Map(function(x, y) compare_means(reformulate(x, 'value'), df, 
       ref.group = y), vars, controls)

或者用map2 来自purrr

library(purrr)
map2(vars, controls, ~ compare_means(reformulate(.x, 'value'), df,
            ref.group = .y))
#[[1]]
# A tibble: 1 x 8
#  .y.   group1 group2     p p.adj p.format p.signif method  
#  <chr> <chr>  <chr>  <dbl> <dbl> <chr>    <chr>    <chr>   
#1 value a      b      0.537  0.54 0.54     ns       Wilcoxon

#[[2]]
# A tibble: 3 x 8
#  .y.   group1 group2     p p.adj p.format p.signif method  
#  <chr> <chr>  <chr>  <dbl> <dbl> <chr>    <chr>    <chr>   
#1 value w      x      0.126  0.38 0.13     ns       Wilcoxon
#2 value w      y      0.985  1    0.98     ns       Wilcoxon
#3 value w      z      0.969  1    0.97     ns       Wilcoxon

【讨论】:

  • 谢谢@akrun。我不是要重新制定。您是否也可以帮助将这种需求应用于 ggplot,它不是相同的公式?例如,让它在 vars 的长度上工作:ggplot(df, aes(vars[1], value))+ geom_boxplot(aes(color = vars[1]))
  • @user42485 以前可以用aes_string(vars[1], "value") 现在可以用aes(!! rlang::sym(vars[1], value)) +
猜你喜欢
  • 2018-10-27
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 2018-05-04
  • 2016-05-28
  • 1970-01-01
相关资源
最近更新 更多