在R中使用sqldf处理包含下划线变量名的变量

3
这段代码
> A <- data.frame(col1 = c(1,2,3),col2 = c("red","blue","green"))
> color_num <- 2
> fn$sqldf("select * from A where col1 >= '$color_num'")

产生错误

在执行eval(parse(text = paste(..., sep = "")), env)时出错:对象'color'未找到

但是,如果变量color_num的名称改为没有下划线的名称(例如colornum),则执行fn$sqldf("select * from A where col1 >= '$colornum'")将返回预期的结果,且不会出现错误。

我认为sqldf在后台使用点号替换下划线,导致它将下划线之前的部分视为表名,将其后面的部分视为列名。关于sqldf中列名的问题,这个答案(以及评论)表示该库曾经将点号替换为下划线,但现在不再替换,但我没有找到任何有关用点号替换下划线的信息。

这是一个问题,因为我使用的命名约定在变量名中大量使用下划线。

有没有办法在sqldf查询中使用带有下划线的变量名?

2个回答

2

你可以使用反引号:

fn$sqldf("select * from A where col1 >= `color_num`")
##   col1  col2
## 1    2  blue
## 2    3 green

1
你可以在sql代码周围使用paste0,这样r会将color_num评估为2,然后将其粘合成一个sql语句。
library(sqldf)
    A <- data.frame(col1 = c(1,2,3),col2 = c("red","blue","green"))
    color_num <- 2

    fn$sqldf(paste0("select * from A where col1 >=",color_num))

如果您想使用$var方法,并且在使用_时遇到困难,这里有一个解决方法,可以让所有变量都具有 . 而不是 _,这可能效率低下,但有效。

color_col <- "blue"
#get list of values with underscores and not your df
nms <- setdiff(ls(),c("A"))
#change name of list to have '.' instead of '_'
setNames(nms,gsub("_",".",nms))
#Assign values to names with '.'s
myvars <- lapply(setNames(nms,gsub("_",".",nms)), function(x){
  assign(gsub("_",".",x) , get(x))})
#bring them to global env
list2env(myvars,.GlobalEnv)

#run example query
fn$sqldf("select * from A where col1 >= '$color.num' and col2 = '$color.col' ")

谢谢@Mike。我已经尝试将 [ ] 包裹在变量名周围,但没有成功。关于使用 paste0 构建字符串,这并不理想,因为变量名可以出现在复杂的 SQL 字符串中的许多位置,所以我必须将许多不同的子字符串 paste0 在一起。理想的解决方案是允许 sqldf 中标准的变量名使用下划线,因为下划线通常出现在变量名中。有办法做到这一点吗? - Rookatu
我看到了问题。这可能是sql包中的一个错误,这里有一个解决方案,您可以将_更改为.,以便您的代码能够正常工作。如果您喜欢这个解决方案,我可以使用lapply来扩展它,以更改所有变量。- assign(gsub("_",".",setdiff(ls(),c("A") )) ,get(setdiff(ls(),c("A") ))) - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接