2016-07-08 8 views
0

У меня есть список значений, которые я создал с функцией слаLooping внутри sqldf на основе вектора

x <- (seq(0,10080,by=50)) 

Я хочу, чтобы добавить эти значения в моем кадре данных в новом столбце называется sequence, где значение из mycol находится между 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

Я не понимаю, как создать такой цикл

ответ

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-запрос.

0

Рассмотрите преимущество 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, и это соответствует синтаксису.