在具有通用列引用的函数中使用 sqldf

Use sqldf inside a function with generic column references

我正在尝试在 r 中的用户定义函数中使用 sqldf 包和通用列名。如果变量名称与函数中的占位符变量名称(xy)匹配,我只能让它工作。但是,无论输入函数的变量名如何,我都希望它能够工作。这是我一直在玩的例子:

这是有效的表格:

df<-data.frame(X=as.factor(c("a","a","a","b","b","b","c","c","c")), Y=c(2.5,3,4,4,5.3,6,6.555,7,8))
df

Bar_Prep1<-function(data,x,y){
  library(sqldf)
  require(sqldf)
  dataframe<-sqldf("select a.[x] Grp, AVG(a.[y]) Mean, stdev(a.[y]) SD, Max(a.[y]) Max
                 from data a
                 group by a.[x]")
  dataframe$RD<-round(dataframe$Mean,digits=0)
  return(dataframe)
}

test<-Bar_Prep1(df,df$X,df$Y)
test

其中returns以下df:

  Grp     Mean        SD Max RD
1   a 3.166667 0.7637626   4  3
2   b 5.100000 1.0148892   6  5
3   c 7.185000 0.7400507   8  7

但是,我希望能够在各种列名上使用该函数,所以我尝试了这个:

df1<-data.frame(a=as.factor(c("a","a","a","b","b","b","c","c","c")), b=c(2.5,3,4,4,5.3,6,6.555,7,8))
df1
test1<-Bar_Prep1(df1,df1$a,df1$b)
test1

Returns 出现以下错误:“错误:没有这样的列:a.x” “找不到对象 'test1'

所以问题是,我需要如何修改我的函数代码以接受“x”和“y”以外的变量名?

传递名称而不是列。将 sqldf 调用更改为 fn$sqldf,这将启用使用 $ 的字符串插值。然后在 select 语句中使用 $x$y.

library(sqldf)

Bar_Prep1 <- function(data, x, y) {
  dataframe <- fn$sqldf("select 
      a.[$x] Grp, 
      AVG(a.[$y]) Mean, 
      stdev(a.[$y]) SD, 
      Max(a.[$y]) Max
    from data a
    group by a.[$x]")
  dataframe$RD <- round(dataframe$Mean, digits = 0)
  return(dataframe)
}

Bar_Prep1(df, "X", "Y")
##   Grp     Mean        SD Max RD
## 1   a 3.166667 0.7637626   4  3
## 2   b 5.100000 1.0148892   6  5
## 3   c 7.185000 0.7400507   8  7

请注意,可以将舍入吸收到 SQL 语句中:

Bar_Prep1 <- function(data, x, y) {
  fn$sqldf("with tmp as (select 
      a.[$x] Grp, 
      AVG(a.[$y]) Mean, 
      stdev(a.[$y]) SD, 
      Max(a.[$y]) Max
    from data a
    group by a.[$x])
  select *, round(Mean) RD from tmp")
}