R-如何在列表上执行循环并输出不同的数据帧

时间:2015-05-22 14:09:54

标签: r loops dataframe rodbc

我试图在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 个答案:

答案 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)

我认为最后一个是您正在寻找的。

答案 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