代码之家  ›  专栏  ›  技术社区  ›  myloginid

使用SQLDF的示例行

  •  3
  • myloginid  · 技术社区  · 9 年前

    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
    

    有什么解决方法吗?

    曼尼什语

    3 回复  |  直到 9 年前
        1
  •  6
  •   Community Egal    7 年前

    这基本上是一个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
    

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

    percentage <- 0.02
    mylimit <- round(nrow(iris) * percentage, 0)
    sqldf(sprintf("select * from iris order by RANDOM() limit %d", mylimit))
    
        2
  •  1
  •   PereG    9 年前

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

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

    所以

    10*totalrows[[1]]/100
    

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

    sqldf("SELECT * FROM iris LIMIT number")
    

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

        3
  •  0
  •   G. Grothendieck    8 年前

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

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