2011-09-21 57 views
2

似乎有一些類似的問題,但時至今日通過循環分配名稱到一個數據幀中的R

我試圖操縱基於SQL調用一組dataframes的我不能完全得到我的頭一輪他們 - 這樣的事情

x <- c(3,9,12) # x is of variable length in real world 

for (i in 1:length(x)) { 
nam <- paste("df",i, sep="") 
assign(nam) <- sqlQuery(channel,paste(
"Select myCol from myTable where myVal =",x[i],sep="")); 
} 

所以我以後dataframes DF1,DF2,DF3,我可以再結合等

下面Andrie的回答是完美的,但我有它延伸到兩個變量

麻煩10
myQuery <- function(t,x){ 
    sqlQuery(channel,paste("Select myCol from myTable where myTextVal='",t,"' and myVal =", x, sep="")) 
} 

x <- c(3,9,12) 
t <-c("00","10","12") 
myData <- lapply(c(t,x), myQuery) 

我得到一個「在粘貼錯誤...參數‘X’爲丟失,沒有默認值」

我不知道這是否是因爲有數字和字符變量的混合在lapply矢量 但在SQL語句中應用as.numeric /as.character似乎並沒有幫助

+0

我知道它的晚小時,所以可能就像你在微睡中感覺到的那樣,你在寫作之前意外地按了ENTER鍵e實際問題.... :-) – TMS

+0

這個問題最有可能與'assign(nam)< - '可能不符合OP想要的事實有關。我認爲你需要把這一切都放在'assign'調用中。 – joran

回答

2

R習語將使用apply類型函數而不是循環。這樣做的效果是您的結果數據對象是list。在這種情況下,它將是一個data.frame對象的列表。

類似以下內容:

myQuery <- function(x){ 
    sqlQuery(channel,paste("Select myCol from myTable where myVal =", x, sep="")) 
} 

x <- c(3,9,12) 
t <- c("00","10","12") 

myData <- lapply(c(t, x), myQuery) 

然後,您可以提取與列表子集個人data.frames:

myData[[1]] 

編輯。重點是lapply將採用單個向量作爲輸入。您的指令c(t, x)將其輸入組合到單個矢量中。因此,您不應該更改myQuery - 它仍然只需要一個輸入參數。

+0

謝謝你的工作正常。我有一個問題將其擴展到我的現實世界的情況,我有2個變量,其中一個是字符 – pssguy

+0

@pssguy那麼,祝你好運。既然你沒有提供有關這個問題的信息,似乎我沒有太多的工作可以幫忙。 – Andrie

+0

抱歉,在完成之前按下輸入按鈕我將編輯原始問題 – pssguy

1

好了,assign功能需要的名稱和值作爲參數:

assign(nam, sqlQuery(channel,paste("Select myCol from myTable where myVal =",x[i],sep=""))) 

類型?assign瞭解更多...

1

您需要mapply

myData <- mapply(myQuery, t, x, SIMPLIFY=FALSE) 

但我認爲更好的辦法是先準備查詢:

queries <- sprintf(
    "Select myCol from myTable where myTextVal='%s' and myVal=%i", 
    t, x) # here I assume that x is integer, see ?sprintf for other formats 
queries 
[1] "Select myCol from myTable where myTextVal='00' and myVal=3" 
[2] "Select myCol from myTable where myTextVal='10' and myVal=9" 
[3] "Select myCol from myTable where myTextVal='12' and myVal=12" 

然後lapply過他們:

myData <- lapply(queries, function(sql) sqlQuery(channel, sql)) 
# could be simplified to: 
myData <- lapply(queries, sqlQuery, channel=channel) 
+0

謝謝馬里克+1。該mapply解決方案工作正常。我也會考慮你的選擇。你爲什麼認爲這樣更好? – pssguy

+0

@pssguy查詢可以在發送到服務器之前進行驗證。分離兩項任務:準備查詢並獲取數據,如果全部在同一時間完成,則整體失敗的機會增加。它還使您的代碼更具可讀性。 – Marek

相關問題