R:根据字符向量选择sqlite数据库的子集

时间:2017-02-08 16:35:22

标签: r sqlite

我正在尝试使用字符向量提取部分数据库。为了解释,我使用了如下的mtcars数据:

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)

我可以找到我感兴趣的数据框部分:

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

但是我的真实数据非常大,我宁愿不将整个数据提取到数据框中。我正在寻找类似的东西:

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

但这给了我错误:“没有这样的表:CarsToFind”。我不想在SQL数据库中创建表'CarsToFind',因为我想要一次性执行许多不同的查询。是否可以使用这样的字符向量查询SQL?

2 个答案:

答案 0 :(得分:2)

您实际想要在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)

答案 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方。