R-如何在列表上循环并输出不同的数据帧
R- How to do a loop on a list and output different dataframes
我正在尝试在 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 个月,所以我绝对愿意接受更清洁、更高效的替代方法。
谢谢。
要么使用:
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)
我想最后一个就是你要找的。
看起来像是 lapply (lapply documentation) 而不是 for 循环的工作。 (在 R 中,通过使用矢量化避免 for 循环通常是好的。)
如果您希望每个日期 return 一个单独的数据框,然后用原始日期标记每个数据框,请尝试:
dates <- c("Jan 1", "Oct 31", "Dec 25")
queryData <- function(date){
#dummy data
return(runif(5))
}
results <- lapply(dates, queryData)
names(results) <- dates
我建议使 SQL 查询成为一个函数,然后使用 lapply
应用它,return 您的结果作为列表。
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 没有什么经验,所以这可能行不通。也许它可以让你开始?
我正在尝试在 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 个月,所以我绝对愿意接受更清洁、更高效的替代方法。
谢谢。
要么使用:
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)
我想最后一个就是你要找的。
看起来像是 lapply (lapply documentation) 而不是 for 循环的工作。 (在 R 中,通过使用矢量化避免 for 循环通常是好的。)
如果您希望每个日期 return 一个单独的数据框,然后用原始日期标记每个数据框,请尝试:
dates <- c("Jan 1", "Oct 31", "Dec 25")
queryData <- function(date){
#dummy data
return(runif(5))
}
results <- lapply(dates, queryData)
names(results) <- dates
我建议使 SQL 查询成为一个函数,然后使用 lapply
应用它,return 您的结果作为列表。
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 没有什么经验,所以这可能行不通。也许它可以让你开始?