R- Как сделать цикл в списке и вывести разные кадры данных

Я пытаюсь создать цикл в R, который будет использовать вектор дат, пропустить их через цикл, который включает в себя запрос SQL, а затем сгенерировать отдельный фрейм данных для каждого вывода. Вот, насколько я получил:

library(RODBC)

dvect <- as.Date("2015-04-13") + 0:2   
d <- list()
for(i in list(dvect)){

    queryData <- sqlQuery(myconn, paste("SELECT
        WQ_hour,
        sum(calls) as calls
        FROM database
        WHERE DDATE = '", i,"'
        GROUP BY 1
        ", sep = ""))

    d[i] <- rbind(d, queryData)
}

Из того, что я могу сказать, часть кода кода работает нормально, так как я тестировал ее сам. Где я спотыкаюсь, это последняя строка, где я пытаюсь сохранить содержимое каждого цикла в запросе отдельно, каждый из которых имеет метку даты, которая была использована в цикле.

Буду признателен за любую помощь. Я постоянно использую R уже около 2 месяцев, поэтому я определенно открыт для альтернативных способов сделать это более чистыми и эффективными.

Благодарю.

3 ответа

Решение

Я бы предложил сделать SQL-запрос функцией и использовать lapply применить его и вернуть свой результат в виде списка.

userSQLquery = function(i) {
  sqlQuery(myconn, paste("SELECT
          WQ_hour,
          sum(calls) as calls
          FROM database
          WHERE DDATE = '", i,"'
          GROUP BY 1
          ", sep = ""))
}

dvect = as.Date("2015-04-13") + 0:2    
d = as.list(1:length(dvect))
names(d) = dvect

lapply(d, userSQLquery)

У меня очень мало опыта работы с SQL, так что это может не сработать. Может быть, это может начать вас?

Похоже, работа для lapply (документация lapply) вместо цикла for. (В R часто хорошо избегать цикла for, используя векторизацию.)

Если вы хотите, чтобы каждая дата возвращала отдельный фрейм данных, а затем каждый фрейм данных был помечен исходной датой, попробуйте:

dates <- c("Jan 1", "Oct 31", "Dec 25")

queryData <- function(date){
#dummy data
  return(runif(5))
}

results <- lapply(dates, queryData)
names(results) <- dates

Либо использовать:

d[[i]] <- queryData

если вы хотите, чтобы каждый data.frame (результат запроса) был отдельным элементом в выводе списка d,

Или используйте:

d <- rbind(d, queryData)

если ты хочешь одного data.frame со всеми результатами запроса вместе взятыми. В этом случае вы должны объявить d как data.frame (то есть d <- data.frame()).


Вы также можете хранить каждый data.frame (т.е. результат запроса) с соответствующей датой в списке как:

d[[i]] <- list(date = dvect[[i]], queryResult = queryData)

Я думаю, что последнее - это то, что вы ищете.

Другие вопросы по тегам