-2

解決:

以下の答えを組み合わせる:

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

編集の終わり

次のコマンドを使用して、データを 1 つずつ取得しています。

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

一時的な解決策として、R に解析するための一連のコマンドを bash で作成することに成功しました。

 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内でそれを行うことは可能だと思います

4

1 に答える 1

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代わりに作成するクエリを返しました。実際にクエリを実行する前に、これらが必要なクエリであることを確認するために、このように少なくとも 1 回実行する必要があります。それらを実行したい場合は、呼び出しのコメントを外して、dbGetQueryクエリを含む行を削除するだけです。


for編集:ループベースのソリューションが本当に必要な場合は、代わりにこれを使用しますmapply

dat <- list()
for(month in months){
    for(year in years){
        id <- paste(year, month, 1, sep = "/")
        dat[[id]] <- getVal(month, year)
    }
}
于 2012-09-30T19:34:12.680 に答える