【发布时间】:2020-12-17 02:33:15
【问题描述】:
在 R 中有没有办法使用 sqldf 包来选择除一列之外的所有列?
【问题讨论】:
-
要求您提供样本数据
dput并用详细信息修改问题。因为sqldf用于汇总数据 -
为什么需要这样的问题?这不是特定的数据问题,而是与 R 包相关的问题。
在 R 中有没有办法使用 sqldf 包来选择除一列之外的所有列?
【问题讨论】:
dput并用详细信息修改问题。因为sqldf用于汇总数据
您基于某些查询对sqldf 的调用应返回一个数据框,其中每个 DF 列对应于 SQL 查询的 select 子句中出现的列之一。考虑以下示例:
sql <- "SELECT * FROM yourTable WHERE <some conditions>"
df <- sqldf(sql)
drop <- c("some_column")
df <- df[, !(names(df) %in% drop)]
注意在上面我正在做一个SELECT * 来获取表中的所有列(我假设是你的用例)。然后,我从结果数据框中提取出 some_column 列的子集。
请注意,直接从 SQL 执行此操作通常不可能。也就是说,一旦你做了SELECT *,猫就出局了,你最终得到了所有的列。
【讨论】:
a 和表 b 并且我在决赛表中使用同一列 customer_id 加入它们,我会看到两个具有相同名称的列 customer_id。这是代码示例data <- sqldf("selec a.*, b.* from a inner join b on (a.customer_id = b.customer_id)")
1) SQLite 使用默认的 SQLite 后端,假设我们要返回 mtcars 中除 cyl 列之外的所有列的前 3 行。首先为所有此类列名创建一个逗号分隔的字符串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 没有返回任何内容,我们添加了一个select 来返回更改后的表。
library(RH2)
library(sqldf)
sqldf(c("alter table mtcars drop column cyl",
"select * from mtcars limit 3"))
【讨论】: