基于向量在 sqldf 中循环
Looping inside sqldf based on a vector
我有一个用 seq 函数创建的值列表
x <- (seq(0,10080,by=50))
我想将这些值添加到我的数据框中名为 sequence
的新列中,其中 mycol
的值介于 x[=16= 中的 i 和 i+1 元素之间]
第一次迭代
test<-sqldf('select *, case when (mycol> first value of x and mycol <= second value of x) then **second value** end as sequence from mydataframe')
第二次迭代
test<-sqldf('select *, case when (mycol> second value of x and mycol <= third value of x) then **third value** end as sequence from test')
等等...直到我传递 x
中的所有数字
我不明白如何创建这样的循环
你可以这样做:
for (i in seq(x)-1){
qry <- paste0("select *, case when (mycol>", x[i], " and mycol <= ",
x[i+1], ") then ", x[i+1], " end as sequence from mydataframe")
test <- sqldf(qry)
}
或使用定义的 f
函数和 sapply
:
f <- function(a, b) { paste0("select *, case when (mycol>", a, " and mycol <= ", b, ") then ", b, " end as sequence from mydataframe") }
sapply(seq(x)-1, function(i) sqldf(f(x[i], x[i+1])))
调整右边的SQL查询即可。
考虑SQL的优势,使用相关聚合子查询代替循环。在这种方法中,您使用两个数据框,原始数据框和序列。
如果我了解您的需求,本质上您需要找到当前行的 mycol
所属的 X
的最大值,因此请使用 MIN()
相关聚合查询。
seqdf <- data.frame(x=(seq(0,10080,by=50)))
test <- sqldf('SELECT d.*, d.MyCol,
(SELECT Min(s.x) FROM seqdf s
WHERE s.x >= d.MyCol) As d.Sequence
FROM mydataframe d')
警告:我不太熟悉 sqldf
包,所以不知道它是否支持这样的子查询(尽管我相信它反映了 SQLite 的方言)。但我确实知道 SQL 并且这是兼容的语法。
我有一个用 seq 函数创建的值列表
x <- (seq(0,10080,by=50))
我想将这些值添加到我的数据框中名为 sequence
的新列中,其中 mycol
的值介于 x[=16= 中的 i 和 i+1 元素之间]
第一次迭代
test<-sqldf('select *, case when (mycol> first value of x and mycol <= second value of x) then **second value** end as sequence from mydataframe')
第二次迭代
test<-sqldf('select *, case when (mycol> second value of x and mycol <= third value of x) then **third value** end as sequence from test')
等等...直到我传递 x
我不明白如何创建这样的循环
你可以这样做:
for (i in seq(x)-1){
qry <- paste0("select *, case when (mycol>", x[i], " and mycol <= ",
x[i+1], ") then ", x[i+1], " end as sequence from mydataframe")
test <- sqldf(qry)
}
或使用定义的 f
函数和 sapply
:
f <- function(a, b) { paste0("select *, case when (mycol>", a, " and mycol <= ", b, ") then ", b, " end as sequence from mydataframe") }
sapply(seq(x)-1, function(i) sqldf(f(x[i], x[i+1])))
调整右边的SQL查询即可。
考虑SQL的优势,使用相关聚合子查询代替循环。在这种方法中,您使用两个数据框,原始数据框和序列。
如果我了解您的需求,本质上您需要找到当前行的 mycol
所属的 X
的最大值,因此请使用 MIN()
相关聚合查询。
seqdf <- data.frame(x=(seq(0,10080,by=50)))
test <- sqldf('SELECT d.*, d.MyCol,
(SELECT Min(s.x) FROM seqdf s
WHERE s.x >= d.MyCol) As d.Sequence
FROM mydataframe d')
警告:我不太熟悉 sqldf
包,所以不知道它是否支持这样的子查询(尽管我相信它反映了 SQLite 的方言)。但我确实知道 SQL 并且这是兼容的语法。