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

Posted

技术标签:

【中文标题】R-如何在列表上循环并输出不同的数据帧【英文标题】:R- How to do a loop on a list and output different dataframes 【发布时间】:2015-05-22 14:09:54 【问题描述】:

我正在尝试在 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 个月,所以我绝对愿意接受更清洁、更高效的替代方法。

谢谢。

【问题讨论】:

你遇到lapply了吗? @AkhilNair 我没有。这是一种更有效的方法吗? 我相信是的。应用函数的要点是它们apply 一个函数向量,因此效率更高。在lapply 的情况下,该函数应用于数据结构中保存的元素(在您的情况下是一个列表,但这可能是可变的),[l]apply 中的l 指的是作为一个返回的数据列表。 【参考方案1】:

我建议将 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 的经验很少,所以这可能行不通。也许它可以让你开始?

【讨论】:

【参考方案2】:

看起来像是 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

【讨论】:

【参考方案3】:

任意使用:

d[[i]] <- queryData

如果您希望每个 data.frame(查询结果)作为列表输出 d 中的单独元素。

或使用:

d <- rbind(d, queryData)

如果您想要一个 data.frame 并结合所有查询输出。在这种情况下,您应该将d 声明为data.frame(即d &lt;- data.frame())。

您还可以将每个data.frame(即查询结果)及其对应的日期存储在一个列表中:

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

我认为最后一个是你要找的。​​em>

【讨论】:

到目前为止,我无法获得第一个工作选项。它给了我一个约 16000 个空值的向量。现在的第二个选项只给我最后一个查询的结果。我会继续努力的 @William,我认为第三个选项应该会产生您想要的结果。

以上是关于R-如何在列表上循环并输出不同的数据帧的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中使用带有 ggpie 函数的循环并在数据帧之后保存文件名?

嵌套 for 循环的 Pandas 在创建的不同数据帧上插入多个数据

使用列表/数据帧作为R中for循环中的项

Scala:如何在循环中组合数据帧

在循环中保存数据帧列表

R中数据帧的列循环