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