r - 如何在字符串向量上迭代调用 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")
如果我有一个变量x
where x <- "hello"
,我将如何“粘贴”x
到sqldf
函数中?
解决方案
sqldf 包自动加载提供fn$
字符串插值的 gsubfn 包。序言sqldf
和fn$
然后在 SQL 字符串中使用
- $ 直接替换或
- 反引号来执行反引号之间的代码,用代码的输出替换所有代码。
请注意,这fn$
是一个通用工具,可以为几乎任何函数添加前缀来预处理其参数——它并不特定于 sqldf。
这里有些例子。请注意,BOD
andiris
内置于 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 = TRUE
到sqldf
调用中。
推荐阅读
- cakephp-3.0 - 在 Cakephp 4 上有很多
- python - 使用毫秒创建日期时间对象
- ruby-on-rails - Rails ActiveRecord::Base.connection 在外部文件上执行
- java - IntelliJ 将所有内容突出显示为警告
- c++ - 如何使用随机数创建 n 个随机大小的列表?
- javascript - 有没有办法知道“视图中的顶部元素”?创建“回滚到你所在的位置”
- java - Java Swing:如何在组件和编辑方向中设置阿拉伯语
- spring-rabbit - 在消费达到某种条件时退订是否安全?
- c# - Azure App Service Deploy - 在部署包中包含来自 grunt 构建的文件
- python - 如何使用python脚本从firestore复制两个项目之间保持文档ID相同的集合文档?