在函数中指定分组变量

Specify grouping variable in a function

我写了一个函数来简化我正在做的一堆相关性的可视化。具体来说,我有兴趣在 ggplot2 面板中并排查看双变量关系,p 值和 rho 值直接打印在图表上。我使用 iris 数据集编写了这个函数:

library(ggplot2)
library(dplyr)

grouped_cor_ <- function(data, x, y, group.col){
  x <- lazyeval::as.lazy(x)
  y <- lazyeval::as.lazy(y)
  cor1 <- lazyeval::interp(~ cor.test(x, y,method="spearman",na.action = "na.exclude")$estimate, x = x, y = y)
  corp <- lazyeval::interp(~ cor.test(x, y,method="spearman", na.action = "na.exclude")$p.value, x = x, y = y)
  mnx <- lazyeval::interp(~ mean(x, na.rm=TRUE), x = x, y = y)
  mny <- lazyeval::interp(~ mean(y, na.rm=TRUE), x = x, y = y)

  summarise_(group_by(data, Species), rho=cor1, pval=corp, xcoord=mnx, ycoord=mny)
}

这是我用来打印相关统计数据的数据框:

grouped_cor_(data=iris, x=~Petal.Width, y=~Petal.Length)

那么这是调用绘图的函数:

corHighlight <- function(Data, x, y){
  cordf<-grouped_cor_(Data, x = substitute(x), y = substitute(y))
  cordf$prho <- paste("rho=",round(cordf$rho,3), "\n p-value=",round(cordf$pval,3), sep=" ")
  plt<-ggplot(Data, aes_q(x = substitute(x), y = substitute(y))) + 
    geom_text(data=cordf, aes_q(x=substitute(xcoord), 
                            y=substitute(ycoord), 
                            label=substitute(prho)), colour='red') + 
    geom_point(size=2, alpha=0.3) +
    facet_wrap(~Species)
  print(plt)
}


corHighlight(Data=iris, 
         x=Petal.Width, 
         y=Petal.Length)

该功能虽然有点笨拙,但现在可以很好地处理一个我似乎无法弄清楚的小细节。我不知道如何为分组变量添加列规范。现在该函数绑定到 iris 数据集,因为它只接受名为“物种”的分组变量。那么我的问题是如何将此函数与 iris 数据集分开并概括分组变量。

任何人都可以推荐一种有效的方法吗?也很乐意接受任何改进功能的评论。

这样您就可以将单个分组因子传递给辅助函数。确实需要使用 group_by_,因为我从公式中提取名称作为字符,然后将其强制转换为名称:

grouped_cor_ <- function(data, x, y, form){
  x <- lazyeval::as.lazy(x)
  y <- lazyeval::as.lazy(y); fac <- as.name(as.character(form)[2])
  cor1 <- lazyeval::interp(~ cor.test(x, y,method="spearman",na.action = "na.exclude")$estimate, x = x, y = y)
  corp <- lazyeval::interp(~ cor.test(x, y,method="spearman", na.action = "na.exclude")$p.value, x = x, y = y)
  mnx <- lazyeval::interp(~ mean(x, na.rm=TRUE), x = x, y = y)
  mny <- lazyeval::interp(~ mean(y, na.rm=TRUE), x = x, y = y)

  summarise_( group_by_(data, fac), rho=cor1, pval=corp, xcoord=mnx, ycoord=mny)
}

为了说明我在评论中所说的(允许函数接受一个可以由`facet_wrap``处理的公式:

corHighlight <- function(Data, x, y, form){
  cordf<-grouped_cor_(Data, x = substitute(x), y = substitute(y), form=substitute(form))
  cordf$prho <- paste("rho=",round(cordf$rho,3), "\n p-value=",round(cordf$pval,3), sep=" ")
  plt<-ggplot(Data, aes_q(x = substitute(x), y = substitute(y))) + 
    geom_text(data=cordf, aes_q(x=substitute(xcoord), 
                            y=substitute(ycoord), 
                            label=substitute(prho)), colour='red') + 
    geom_point(size=2, alpha=0.3) +
    facet_wrap(form)
  print(plt)
}
corHighlight(Data=iris, 
         x=Petal.Width, 
         y=Petal.Length, form = ~Species)