使用SQLDF的示例行

时间:2015-09-03 12:10:55

标签: r sample sqldf

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

e.g。

> 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

是否有一些解决方法?

和Manish

3 个答案:

答案 0 :(得分:6)

这基本上是一个SQL问题。由于sqldf默认使用SQLite(这不是绝对正确的,请参阅drv?sqldf的文档以获取更多详细信息),问题归结为“如何以随机顺序选择行在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

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

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

答案 1 :(得分:1)

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

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

左右....

10*totalrows[[1]]/100

获取&#34;号码&#34;并放在这里:

sqldf("SELECT * FROM iris LIMIT number")

无论如何,这是一个sql而不是R

的问题

答案 2 :(得分:0)

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