【问题标题】:Syntax for getting data from SQLlite db with a loop?使用循环从 SQLite db 获取数据的语法?
【发布时间】:2012-09-21 17:48:57
【问题描述】:

解决方案:

结合下面的答案:

#First create a vector with all my dates

#Create a frame to hold the data
testdf = data.frame(sdci=rep("",1),stringsAsFactors=FALSE)

#needs library(lubridate) for month/year functions
library(lubridate)

#Loop and Add data to the df
for (i in 1:lenght(dates2){testdf[i, ] = c(dbGetQuery(con,paste0(' SELECT \
sdci_',year(dates2[i]),'_',sprintf("%02d",month(dates2[i])),'_mean from \ 
gr_sea_outlets_tier2 order by area_km2'))}

编辑结束

我正在使用这个命令一个接一个地获取我的数据:

data$"2000/8/1" = dbGetQuery(db,"SELECT sdci_2000_08_mean as '2000/08/01' from  gr_sea_outlets_tier2 order by area_km2 desc limit 1;")

但由于我有 50 张桌子,所以过程变得有点烦人。

我正在尝试为它创建一个循环,但我不知道语法。

这是我想做的一些伪代码(类似bash):

for year in $(seq 2000 2010); do
    for month in $(seq -w 05 09); do
         data$"$year"/"$month"/01" = dbGetQuery(db,"SELECT sdci_$year_$month_mean as '$year/$month/01' from  gr_sea_outlets_tier2 order by area_km2 desc limit 1;"); 
        done; 
 done

作为一个临时解决方案,我设法让 bash 创建一组命令供我解析为 R。

 for year in $(seq 2000 2010); do for month in $(seq -w 05 09); do echo data\$\'"$year"-"$month"-"01"\' \<\- dbConnect\(db,\"SELECT sdci_"$year"_"$month"_mean from gr_sea_outlets_tier2 order by area_km2 desc limit 1\;\"\) >> r.cmd.data ; done; done

但我认为它可以在 R 内完成

【问题讨论】:

  • 交叉发布是个坏主意。无论如何,这在这里更相关。仅仅因为 R 是一种统计语言并不意味着您的问题与统计数据有关。
  • 另外,您是否尝试过查找for 循环的语法?您可以使用?`for` 或搜索for loop r 获取语法。
  • 您在 R 语法中的一个示例似乎与其他示例不一致。您选择 sdci_2000_07_mean 但其余的似乎使用 2000/08。这应该修复吗?
  • 是的,我在做实验,那是我实验的遗留物 :)

标签: r syntax


【解决方案1】:

使用列表来存储输出可能是最好的选择。但我们会让mapply 为我们处理这些事情。

# Get the inputs we want
years <- 2000:2010
months <- sprintf("%02d", 5:9)
dat <- expand.grid(months = months, years = years)

# Construct a function that gets the query given the month and year
getVal <- function(month, year){
    query <- paste0("SELECT sdci_", 
                    year, "_", month, "_mean as '", 
                    year, "/", month, 
                    "/01' from gr_sea_outlets_tier2 order by",
                    " area_km2 desc limit 1;")
    #dbGetQuery(db, query)
    query
}

# Actually apply the function to each month/year combo of interest
out <- mapply(getVal, dat$months, dat$years)

我注释掉了dbGetQuery 调用,而只是返回了要进行的查询。您可能应该像这样至少运行一次,以在实际运行查询之前检查这些查询是否是您想要的。一旦您想运行它们,只需取消注释对 dbGetQuery 的调用并删除仅包含查询的行。


编辑:如果我们真的想要一个基于 for 循环的解决方案,请使用它而不是 mapply

dat <- list()
for(month in months){
    for(year in years){
        id <- paste(year, month, 1, sep = "/")
        dat[[id]] <- getVal(month, year)
    }
}

【讨论】:

  • 我不能说它是一个优雅的解决方案,但是当我开始学习 R 时,我认为如果能找到如何实现 for 解决方案会更有益。跨度>
  • 这个答案有什么你不接受的地方吗?
  • 您的回答是一个不错的起点!你的循环给了我一个“逐行添加”解决方案的想法!
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 2017-09-14
  • 2012-07-07
  • 2017-11-17
  • 2016-04-24
  • 2021-04-16
  • 1970-01-01
  • 2015-11-10
相关资源
最近更新 更多