问题描述
R中有没有一种方法可以使用sqldf
包来选择除一个以外的所有列?
解决方法
您基于某个查询对bash 5.0.11
的调用应返回一个数据帧,其中每个DF列对应于SQL查询的select子句中出现的列之一。考虑以下示例:
sqldf
在上面的注释中,我正在执行sql <- "SELECT * FROM yourTable WHERE <some conditions>"
df <- sqldf(sql)
drop <- c("some_column")
df <- df[,!(names(df) %in% drop)]
以获取表中的所有列(我认为这是您的用例)。然后,我从结果数据框中删除列SELECT *
的子集。
请注意,通常不可能直接从SQL直接执行此操作。也就是说,一旦您执行some_column
,猫就会从书包中脱颖而出,并且最终所有列都结束。
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"))