2012-09-30 18 views
-2

解决方案:从具有循环的SQLlite数据库获取数据的语法?

结合的答案波纹管:

#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'))} 

END编辑

我一个接一个用这个命令让我的数据:

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个表格的过程beco mes有点烦人。

我试图为它创建一个循环,但我无法确定语法。

这里是我想要做一些伪代码(庆典等):

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 

作为tempory解决香港专业教育学院设法获取的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

+0

交叉张贴是一个坏主意。无论如何,这更相关。仅仅因为R是统计语言并不意味着你的问题与统计有关。 – Dason

+1

另外,你有没有试过查找'for'循环的语法?您可以使用'?'作为''或搜索'for循环r'来获得语法。 – nograpes

+1

你在R语法中的一个例子似乎与其余的不一致。你穿sdci_2000_07_mean,但其余的似乎使用2000/08。这应该解决吗? – Dason

回答

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) 
    } 
} 
+0

我不能说它是一个优雅的解决方案,但是当我开始学习R时,我会争辩说如果能找到它,它会更有益处实施'for'解决方案。 – user528025

+1

如果你愿意...... – Dason

+0

有没有关于这个答案的任何东西,你没有找到可以接受的? – Dason