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)
Я думаю, что последнее - это то, что вы ищете.