我试图在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个月,所以我绝对愿意采用更干净,更有效的替代方法。
感谢。
答案 0 :(得分:2)
我建议将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的经验很少,所以这可能不起作用。也许它会让你失望?
答案 1 :(得分:1)
使用:
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)
我认为最后一个是您正在寻找的。 em>
答案 2 :(得分:1)
看起来像lapply (lapply documentation)而不是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