2017-02-08 2 views
3

文字ベクトルを使用してデータベースの一部を抽出しようとしています。私は私が使用することに興味を持ってデータフレームのセクション見つけることができるR:文字ベクトルに基づいてsqliteデータベースのサブセットを選択する

library(dplyr) 
library(sqldf) 
library(RSQLite) 

df <- cbind(rownames(mtcars),mtcars) 
colnames(df)[1] <- "CarName" 
CarsToFind <- c("Valiant", "Merc 280", "Lotus Europa", "Volvo 142E") 
db <- dbConnect(SQLite(), dbname = 'mtcars_db.sqlite3') 
dbWriteTable(conn = db, name = 'mtcars_table', value = df, row.names = TRUE, header = TRUE) 

:説明するために、以下のように私はmtcarsデータを使用している

mini_df <- df[df$CarName %in% CarsToFind,] 

を私の実際のデータは非常に大きく、私はむしろ全部をデータフレームに抽出しません。私は次のようなものを探しています:

sqldf("SELECT * FROM mtcars_table WHERE CarName IN CarsToFind") 

しかし、これは私に「no such table:CarsToFind」というエラーを与えます。私は一度オフに実行したい多くの異なるクエリがあるので、SQLデータバンクにテーブル 'CarsToFind'を作成したくありません。そのような文字ベクトルを使用してSQLを照会することは可能ですか?

答えて

1

あなたが実際にSQLiteの上で実行するクエリは、次のようになります。

SELECT * 
FROM mtcars 
WHERE CarName IN ('Valiant', 'Merc 280', 'Lotus Europa', 'Volvo 142E') 

をだからあなたがする必要があるすべてはRで、この文字列を構築です:

CarsToFind <- c("Valiant", "Merc 280", "Lotus Europa", "Volvo 142E") 
CarsToFind <- paste0("'", CarsToFind, "'", collapse=", ") 
whereIn <- paste0("(", CarsToFind, ")") 

query <- paste0("SELECT * FROM mtcars WHERE CarName IN ", whereIn)    
sqldf(query) 
+0

私はこのエラーメッセージを受け取ります。 rsqlite_send_query(conn @ ptr、statement)のエラー:認識できないトークン:「280」「 私が間違っていることは何ですか? – nm200

+0

'query'が実際に正しいクエリを持っていることを確認できますか? –

+0

うん、ありがとう、それは問題だった。 sQuoteは '(中括弧記号)を挿入しますが、'(直筆記号)は必要です。私はちょうどgsubとまっすぐ引用符のためのすべての中かっこの引用を交換し、今それは完全に動作します。ありがとうございました! – nm200

1

どの程度の代わりに作成します文字ベクトルの場合、1つの列だけを持つdataframeを作成しますか?これは動作します:

また
CarsToFind <- data.frame(lookup=c("Valiant", "Merc 280", "Lotus Europa", "Volvo 142E")) 

sqldf("SELECT * FROM df WHERE CarName IN CarsToFind") 

を、あなたはSQL側に何も追加/変更する必要はありませんこの方法では、あなたはまだR側のすべてを維持することができます。

+0

すごく簡単!ありがとうマイク。 – nm200

+0

申し訳ありませんが、あまりにも早く回答しました...これは依然としてSQLではなくデータフレームをクエリします。 dfをmtcars(SQLの名前)に変更すると、同じエラーメッセージ 'no such table:CarsToFind'が表示されます – nm200

+0

Hm、再現性のあるエラーを投稿できますか?元のクエリでは、mtcarsを参照しますが、mtcarsには "CarName"変数がありません –

関連する問題