2017-06-19 114 views
7
Error: Cannot pass NA to dbQuoteIdentifier() 

此外不能通過NA到dbQuoteIdentifier():警告消息:錯誤:sqldf包中的R

In field_types[] <- field_types[names(data)] : 
    number of items to replace is not a multiple of replacement length 

這是錯誤消息我感到在試圖運行當今sqldf包東西越來越。昨天運行的相同查詢今天不運行,我做錯了什麼?

+2

請檢查[問]和[mcve]。 –

回答

1

昨天當我突然無法將R表上傳到遠程桌面上的SQLite數據庫時,我遇到了同樣的問題。

lghdb <- dbConnect(SQLite(), 'lgh.db' 
dbWriteTable(lghdb, 'SrtrRisks', SrtrRisks) 
Error: Cannot pass NA to dbQuoteIdentifier()... 

得過且過了一段時間後,我意識到,這個錯誤是由於解決SQLite數據庫被「鎖定」因未完成的(未提交)的事務,涉及到我使用SQLite的瀏覽器同時工作。一旦我提交待處理的事務,問題就消失了。

我想你也一定知道了,因爲你的帖子沒有跟進。對於RSQLite人員來說,在這些情況下他們是否可以返回更有用的錯誤消息可能會更好。

拉里Hunsicker

5

我有同樣的問題:

Error: Cannot pass NA to dbQuoteIdentifier() 
In addition: Warning message: 
In field_types[] <- field_types[names(data)] : 
number of items to replace is not a multiple of replacement length 

一些研究之後,我發現我在一個表中選擇的同一列兩次:

table1<- sqldf("select columnA, 
         columnA, 
         keyA 
       from tableA") 
table2<- sqldf("select columnB, 
         keyB 
       from tableB") 

problematicMerge<- sqldf("select a.*, 
           b.* 
          from tableA a join 
           tableB 
          on a.keyA = b.keyB") 

這是通過解決改變table1刪除重複的列(見下文: - 我懷疑別名之一的列有不同的名稱也將做到這一點):

table1<-sqldf("select columnA, 
         keyA 
       from tableA") 

希望這有助於

+0

我已經將問題#230添加到RSQLite包問題列表中。 https://github.com/rstats-db/RSQLite/issues/230 –

0

我也遇到了同樣的錯誤:

## step1: encountered the error as below while joining two tables 
    screens_temp_2 = sqldf("SELECT a.* , b.ue as 'sp_used_ue' , b.te as 
    'sp_used_te' from screens_temp a left outer join sp_temp b on 
    a.screen_name = b.screen_name ") 
    Error: Cannot pass NA to dbQuoteIdentifier() 
    In addition: Warning message: 
    In field_types[] <- field_types[names(data)] : 
    number of items to replace is not a multiple of replacement length 
    ## step2: while checking the column names , this is what i found 
    colnames(screens_temp) 
    [1] "screen_name" "usv"   "tsv"   "20_ue"  "20_te"  
    [6] "40_ue"  "40_te"  "60_ue"  "60_te"  "80_ue"  
    [11] "80_te"  "100_ue"  "100_te"  "sp_load_ue" "sp_load_te" 
    [16] "sp_load_ue" "sp_load_te" 

上述結果表明,sp_load_ue和sp_load_te重複。

## below i corrected the column names: 
    colnames(screens_temp) <- c("screen_name", "usv", "tsv", "20_ue", "20_te", "40_ue" , "40_te" , "60_ue" , "60_te" , "80_ue" , "80_te"  ,"100_ue" , "100_te" , "sp_load_ue" , "sp_load_te" , "sp_used_ue" , "sp_used_te") 
    write.table(screens_temp, "screens_temp_corrected.csv", row.names = FALSE ,col.names = TRUE, sep = ",") 

    ## again i ran step 1, it worked fine. 

注意:我認爲在sqldf中存在一個bug,因爲它允許在將輸出分配給數據框的同時重複列名。它應該在將輸出分配給數據框時引發錯誤/警告,以便用戶可以適當地重命名列。

+0

在dbWriteTable調用中將數據幀寫入數據庫時​​發生這種情況,而不是在讀回時發生。即使沒有sqldf也會發生這種情況。例如,如果'library(RSQLite); dd < - data.frame(1,2); (dd)< - c(「a」,「a」); con < - dbConnect(SQLite()); dbWriteTable(con,「dd」,dd)'給出錯誤,而'sqldf(「選擇需求,來自BOD的需求」)不會。如果您使用RH2後端,它將報告重複列作爲錯誤,並將識別重複的列名稱。 –

1

與循環內的sqldf有相同的問題。通過將其放入data.frame調用中解決它:data.frame(sqldf(..))。