使用 SQLDF 的示例行

Sample Rows with SQLDF

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

是否有一些解决方法?

马尼什

这基本上是一个 SQL 问题。由于 sqldf 默认使用 SQLite(这不是绝对正确的,有关详细信息,请参阅 ?sqldfdrv 的文档),问题归结为 "How to select rows in random order in 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))

不是很优雅(SQL 不是我的强项)但它有效。

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

所以....

10*totalrows[[1]]/100

获取 "number" 并放在这里:

sqldf("SELECT * FROM iris LIMIT number")

不管怎么说,都是sql而不是R

的问题

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