基于向量在 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 并且这是兼容的语法。