首页 > 解决方案 > 如何在字符串向量上迭代调用 sqldf?(在 R 中命名列表元素)

问题描述

我的目标是创建一个列表,其中每个元素都包含一个数据框。数据框是通过迭代
调用创建的。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] <- "hello"

L$hello <- sqldf(select Year, sum(case when names='hello' then Nums) as Total from Data group by Year")

类似地,第二个元素L$world是通过将函数调用中的“'hello'”替换为“'world'”来创建的。

但是,如果我有很多名字,这将是一个大问题。

我的迭代尝试在这里:

for (i in names) {

    j=j+1
    names(L)[j] <- i
    L[[j]] <- sqldf("select Year, sum(case when names='names[names == i]' then Nums end) as 'Total' from Data group by Year")

}

问题肯定在for我有names='names[names == i]'论点的循环的第三行。我将如何修改这个?

我认为它归结为:如何将字符串“粘贴”到函数调用中?

例如,而不是这样做:

sqldf("select Year, sum(case when names='hello' then Nums end) as 'Total' from Data group by Year")

如果我有一个变量xwhere x <- "hello",我将如何“粘贴”xsqldf函数中?

标签: rlistsqldf

解决方案


sqldf 包自动加载提供fn$字符串插值的 gsubfn 包。序言sqldffn$然后在 SQL 字符串中使用

  1. $ 直接替换或
  2. 反引号来执行反引号之间的代码,用代码的输出替换所有代码。

请注意,这fn$ 是一个通用工具,可以为几乎任何函数添加前缀来预处理其参数——它并不特定于 sqldf。

这里有些例子。请注意,BODandiris内置于 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将参数添加verbose = TRUEsqldf调用中。


推荐阅读