如何在字符串向量上迭代调用sqldf?(在R中命名列表元素)

如何在字符串向量上迭代调用sqldf?(在R中命名列表元素),r,list,sqldf,R,List,Sqldf,我的目标是创建一个列表,其中每个元素都包含一个数据帧。 数据帧是通过迭代调用sqldf创建的 我想做的一个例子是: 我有一个向量names,包含我列表中的名称 > names [1] "hello" "world"` 该列表名为L,长度为length(names) 现在,L看起来像这样 > L [[1]] [1] 0 [[2]] [1] 0 我希望它看起来像: > L $hello Year Total 1 2000 100 2 2001 200 $w

我的目标是创建一个列表,其中每个元素都包含一个数据帧。
数据帧是通过迭代调用
sqldf
创建的

我想做的一个例子是:
我有一个向量
names
,包含我列表中的名称

> names
[1] "hello" "world"` 
该列表名为
L
,长度为
length(names)

现在,
L
看起来像这样

> L
[[1]]
[1] 0

[[2]]
[1] 0  
我希望它看起来像:

> L
$hello
  Year Total
1 2000   100
2 2001   200

$world
  Year Total
1 2000   150
2 2001   250 
第一个元素
L$hello
是通过调用


names(L)[1]您可以在名称向量上使用
glue
map

library(sqldf)
library(glue)
library(purrr)

map(setNames(my.names, my.names), ~
    "select sum(case when a = '{.x}' then b end) as Total 
     from df" %>% 
      glue %>% 
      sqldf)

# $`hello`
#   Total
# 1    24
# 
# $world
#   Total
# 1    31
你可以不用
glue
purr
来做这件事,但在我看来它看起来有点难看

lapply(setNames(my.names, my.names), function(x)
  sqldf(paste0("select sum(case when a = '", x, "' then b end) as Total 
                from df")))
# $`hello`
#   Total
# 1    24
# 
# $world
#   Total
# 1    31
此答案中使用的示例数据:

my.names <- c("hello", "world")
set.seed(1)
df <- data.frame(a = sample(my.names, 10, T), b = sample(1:10))

my.namessqldf包自动加载gsubfn包,该包为字符串插值提供
fn$
。序言
sqldf
带有
fn$
,然后在SQL字符串中使用

  • 直接替换或替换$
  • 反引号在反引号之间执行代码,并用代码的输出替换所有的反引号 请注意,
    fn$
    是一种通用工具,它可以在任何函数之前预先处理其参数,而不是特定于sqldf

    这里有一些例子。请注意,
    BOD
    iris
    内置于R中

    library(sqldf)
    
    a <- 3
    fn$sqldf("select * from BOD where Time > $a")
    ##   Time demand
    ## 1    4   16.0
    ## 2    5   15.6
    ## 3    7   19.8
    
    fn$sqldf("select * from BOD where Time > `a+1`")
    ##   Time demand
    ## 1    5   15.6
    ## 2    7   19.8
    
    irisType <- "setosa"
    fn$sqldf("select sum([Petal.Length]) from iris where Species = '$irisType'")
    ##   sum([Petal.Length])
    ## 1                73.1
    
    库(sqldf)
    A.
    
    my.names <- c("hello", "world")
    set.seed(1)
    df <- data.frame(a = sample(my.names, 10, T), b = sample(1:10))
    
    library(sqldf)
    
    a <- 3
    fn$sqldf("select * from BOD where Time > $a")
    ##   Time demand
    ## 1    4   16.0
    ## 2    5   15.6
    ## 3    7   19.8
    
    fn$sqldf("select * from BOD where Time > `a+1`")
    ##   Time demand
    ## 1    5   15.6
    ## 2    7   19.8
    
    irisType <- "setosa"
    fn$sqldf("select sum([Petal.Length]) from iris where Species = '$irisType'")
    ##   sum([Petal.Length])
    ## 1                73.1