基于向量在sqldf内部循环

时间:2016-07-08 15:41:53

标签: r loops seq sqldf

我有一个使用seq函数

创建的值列表
x <- (seq(0,10080,by=50))

我想在我的数据框中将这些值添加到名为sequence的新列中,其中mycol的值介于i和x中的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

中的所有数字

我不明白如何创建这样的循环

2 个答案:

答案 0 :(得分:1)

考虑SQL的优势并使用相关的聚合子查询代替循环。在这种方法中,您使用两个数据帧,原始数据和序列。

如果我了解您的需求,基本上您需要找到当前行X所属的mycol的最高值,因此请使用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,这是兼容的语法。

答案 1 :(得分:0)

您可以这样做:

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查询。