我有一个使用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
我不明白如何创建这样的循环
答案 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查询。