Select 除 R sqldf 包中的一列外的所有列

Select all columns except one in R sqldf package

在 R 中有没有一种方法可以使用 sqldf 包来 select 除一列之外的所有列?

您基于某些查询对 sqldf 的调用应该 return 一个数据框,其中每个 DF 列对应于您的 [=] 的 select 子句中出现的列之一25=]查询。考虑以下示例:

sql <- "SELECT * FROM yourTable WHERE <some conditions>"
df <- sqldf(sql)
drop <- c("some_column")
df <- df[, !(names(df) %in% drop)]

请注意,在上面我正在执行 SELECT * 来获取 table 中的所有列(我假设是您的用例)。然后,我从结果数据框中提取列 some_column

请注意,通常 不可能直接从 SQL 执行此操作。也就是说,一旦您执行了 SELECT *,就万事大吉了,您最终得到了所有列。

1) SQLite 使用默认的 SQLite 后端,假设我们想要 return 所有列的前 3 行在 mtcars 中,cyl 列除外。首先创建一个包含所有此类列名称的逗号分隔字符串 sel,然后使用 fn$sqldf 允许字符串插值在 SQL 语句中将其引用为 $sel。如果要查看生成的 SQL 语句,请将 verbose=TRUE 参数添加到 sqldf

library(sqldf)

sel <- toString(setdiff(names(mtcars), "cyl"))
fn$sqldf("select $sel from mtcars limit 3")

给予:

   mpg disp  hp drat    wt  qsec vs am gear carb
1 21.0  160 110 3.90 2.620 16.46  0  1    4    4
2 21.0  160 110 3.90 2.875 17.02  0  1    4    4
3 22.8  108  93 3.85 2.320 18.61  1  1    4    1

2) H2 H2后端支持alter table ... drop column ...所以我们可以这样写。由于 alter 没有 return 任何东西,我们添加了一个 select,其中 return 改变了 table。

library(RH2)
library(sqldf)

sqldf(c("alter table mtcars drop column cyl", 
        "select * from mtcars limit 3"))