在具有通用列引用的函数中使用 sqldf
Use sqldf inside a function with generic column references
我正在尝试在 r 中的用户定义函数中使用 sqldf
包和通用列名。如果变量名称与函数中的占位符变量名称(x
和 y
)匹配,我只能让它工作。但是,无论输入函数的变量名如何,我都希望它能够工作。这是我一直在玩的例子:
这是有效的表格:
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")
}
我正在尝试在 r 中的用户定义函数中使用 sqldf
包和通用列名。如果变量名称与函数中的占位符变量名称(x
和 y
)匹配,我只能让它工作。但是,无论输入函数的变量名如何,我都希望它能够工作。这是我一直在玩的例子:
这是有效的表格:
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")
}