web-dev-qa-db-ja.com

エラー:RのsqldfパッケージのdbQuoteIdentifier()にNAを渡すことができません

Error: Cannot pass NA to dbQuoteIdentifier()

さらに:警告メッセージ:

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

これは、今日sqldfパッケージで何かを実行しようとしたときに表示されるエラーメッセージです。昨日実行されたのと同じクエリが今日実行されません。何が間違っているのでしょうか。

11

私は同じ問題を抱えていました:

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

調査の結果、1つのテーブルで同じ列を2回選択したことに気付きました。

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を変更することで解決されました(以下を参照してください:-列の1つを別の名前にエイリアスすることでもうまくいくと思います):

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

お役に立てれば

8
John Adams

ループ内のsqldfで同じ問題が発生しました。 data.frame呼び出し内に配置することで解決しました:data.frame(sqldf(..))。

1
John W

私も同じエラーに遭遇しました:

    ## 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にはバグがあり、データフレームに出力を割り当てるときに列名を繰り返すことができると思います。ユーザーが列の名前を適切に変更できるように、出力をデータフレームに割り当てるときにエラー/警告をスローする必要があります。

1
Lionel Pinto

昨日、リモートデスクトップのRからSQLiteデータベースにテーブルを突然アップロードできなくなったときに同じ問題が発生しました。

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

しばらく混乱した後、このエラーは、SQLiteブラウザを使用した同時作業に関連する未完了の(コミットされていない)トランザクションが原因でアドレス指定されたSQLiteデータベースが「ロック」されたことが原因であることに気付きました。保留中のトランザクションをコミットすると、問題は解消されました。

あなたの投稿へのフォローアップがなかったので、あなたもこれを理解したに違いないと思います。 RSQLiteの人々にとって、これらの状況でより役立つエラーメッセージを返すことができるかどうかを確認するのは良いことかもしれません。

ラリー・ハンシッカー

1
Larry Hunsicker