【问题标题】:Select all columns except one in R sqldf package选择 R sqldf 包中除一列之外的所有列
【发布时间】:2020-12-17 02:33:15
【问题描述】:

在 R 中有没有办法使用 sqldf 包来选择除一列之外的所有列?

【问题讨论】:

  • 要求您提供样本数据dput并用详细信息修改问题。因为sqldf用于汇总数据
  • 为什么需要这样的问题?这不是特定的数据问题,而是与 R 包相关的问题。

标签: sql r sqldf


【解决方案1】:

您基于某些查询对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 *,猫就出局了,你最终得到了所有的列。

【讨论】:

  • 好的,谢谢。但是有什么办法可以避免在加入 2 个表后出现双列?我的意思是,如果我有表 a 和表 b 并且我在决赛表中使用同一列 customer_id 加入它们,我会看到两个具有相同名称的列 customer_id。这是代码示例data &lt;- sqldf("selec a.*, b.* from a inner join b on (a.customer_id = b.customer_id)")
  • 不,没有可靠的方法来做到这一点,除非命名相同的两列也巧合地恰好具有相同的确切数据。在这种情况下,您可以从 R 中任意保留这两列之一。但是,我不建议走这条路。一般来说,您应该始终明确列出您想要选择的所有列。
  • 我已经回答了你最初的问题,你不应该在这里提出后续问题。
  • 但是,如果问题是从您的回答中提出来的,我认为这是提出其他问题的正确地方。无论如何,谢谢。
  • 无论如何,我认为这是回答这个附加问题的最佳地点,因为它与同一主题相关 - 在 SQL 中选择数据时不包括列。
【解决方案2】:

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"))

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2013-01-01
    • 2012-10-03
    • 1970-01-01
    相关资源
    最近更新 更多