【问题标题】:Sample Rows with SQLDF使用 SQLDF 的示例行
【发布时间】:2016-09-10 06:03:06
【问题描述】:

sqldf 有一个限制选项来获取“X”行。我们也可以使用 sqldf 做一个“x%”的样本吗?

例如

> sqldf("select * from iris limit 3")

Loading required package: tcltk
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa

> sqldf("select * from iris sample 0.01")
Error in sqliteSendQuery(con, statement, bind.data) : 
  error in statement: near ".1": syntax error

有解决办法吗?

马尼什

【问题讨论】:

  • 这是一个完全正确的问题,但是您在R 中使用sqldf 有什么原因吗?为什么不是纯 SQL?或者,如果您愿意,为什么 R 中的另一种解决方案不适合这里?
  • 由于问题是sql问题,可能与this one重复
  • @Hugh - 我来自 SQL 背景。在 sqldf 中工作以更改表/子选择列和行/分组方式/拥有等要舒服得多。因此希望在 SQL 中完成所有这些,然后在示例行中完成。
  • 参见sqldf github页面上的示例6e:github.com/ggrothendieck/sqldf

标签: r sample sqldf


【解决方案1】:

这基本上是一个 SQL 问题。由于sqldf 默认使用 SQLite(这不是绝对正确的,有关更多详细信息,请参阅?sqldf 中的drv 文档),问题归结为“如何在 SQLite 中以随机顺序选择行?”。一个简单的答案可以在this SO post找到:

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;

使用问题中的示例:

> sqldf("select * from iris order by RANDOM() limit 3")
  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1          6.3         3.3          4.7         1.6 versicolor
2          6.0         2.7          5.1         1.6 versicolor
3          5.0         2.0          3.5         1.0 versicolor

编辑:如果给出 percentage 而不是 number 行,则以下可用作 R 解决方案。可能存在纯 SQLite 解决方案。

percentage <- 0.02
mylimit <- round(nrow(iris) * percentage, 0)
sqldf(sprintf("select * from iris order by RANDOM() limit %d", mylimit))

【讨论】:

  • 这很好用。只是在进行分组或有子句时,行的 nbr 可能会有所不同,因此我们需要 2 个步骤 - 一个用于创建计算的数据框,另一个用于在我们获得行数后进行 x% 采样。
【解决方案2】:

不是很优雅(SQL 不是我的强项)但它可以工作。

library(sqldf)
totalrows <- sqldf("SELECT COUNT(*) AS NumberOfOrders FROM iris") 

所以....

10*totalrows[[1]]/100

获取“数字”并放在这里:

sqldf("SELECT * FROM iris LIMIT number")

无论如何都是sql的问题,而不是R的问题

【讨论】:

    【解决方案3】:

    使用sqldf home page中的6e,我们可以使用SQL从iris中随机获取10%的记录,如下所示:

    library(sqldf)
    
    sqldf("select * from iris order by random(*) limit 0.10 * (select count(*) from iris)")
    

    要按分数参数化,试试这个:

    frac <- 0.10
    fn$sqldf("select * from iris order by random(*) limit $frac * (select count(*) from iris)")
    

    【讨论】:

      猜你喜欢
      • 2018-07-25
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2020-06-17
      相关资源
      最近更新 更多