如何在字符串向量上迭代调用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