2015-09-03 43 views
2

sqldf具有獲取'X'行的限制選項。我們是否也可以使用sqldf做一個'x%'樣本?使用SQLDF的示例行

例如

> 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

這是一個完全有效的問題,但有您使用的是''R'一個sqldf'原因?爲什麼不是純粹的SQL?或者,如果你喜歡,爲什麼R中的另一個解決方案在這裏不適合? – Hugh

+1

由於問題是一個SQL問題,可能重複[this one](http://stackoverflow.com/questions/5615172/mysql-limit-by-a-percentage-of-the-amount-of-records) – Tensibai

+0

@Hugh - 我來自SQL背景。在sqldf中更方便地更改表/子查詢列和行/組bys/havings等等。因此,希望在SQL中執行所有操作,然後執行Sample行。 – myloginid

回答

5

這基本上是一個SQL問題。由於sqldf默認使用SQLite(這不是絕對正確,請參閱?sqldfdrv的文檔以獲取更多詳細信息),問題歸結爲「如何在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 

編輯:如果百分比而不是行給出,以下可以用作R解決方案。純SQLite解決方案可能存在。

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

此工作正常。只是在做一個group或by的子句時,行的數量會有所不同,所以我們需要2個步驟 - 一個創建計算的數據框,另一個創建計算的數據框,另一個創建行數。 – myloginid

1

不是很優雅(SQL不是我的強項),但它的工作原理。

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

左右....

10*totalrows[[1]]/100 

得到 「數」,並把這裏:

sqldf("SELECT * FROM iris LIMIT number") 

在任何情況下,SQL,而除R

的問題
0

sqldf home page使用6e我們可以從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)")