【问题标题】:R call variable inside sqldfsqldf中的R调用变量
【发布时间】:2015-03-11 13:56:13
【问题描述】:

我需要对 sqldf 语句进行循环,为此我需要在 sqldf 代码中调用循环变量:

我的表“数据”,可能是:

data <- read.table(text ="
    loaddate DaysRange DaysRangeNext
1 2014-03-16        30            30
2 2014-03-16         0             0
3 2014-03-16         0             0
4 2014-03-16        60            NA
5 2014-04-16        30            30
6 2014-04-16         0            30
"
,header = TRUE)

然后我将 loaddate 格式化为日期:

data$loaddate<-as.Date(as.character(data$loaddate), format='%Y-%m-%d')

假设我有一个向量“loaddates”:

loaddates<- unique(sort(data$loaddate))

我需要为每个加载日期运行以下代码:

for (i in loaddates) {

sqldf("
SELECT D.LoadDate,D.DaysRange, D.DaysRangeNext, 
COUNT(*) AS clientes
FROM data AS D
WHERE D.loaddate = i
GROUP BY D.LoadDate,D.DaysRange, D.DaysRangeNext
ORDER BY D.DaysRange, D.DaysRangeNext
")        }

但我收到以下错误:

sqliteSendQuery(con, statement, bind.data) 中的错误:错误 声明:没有这样的列:i

有没有办法保留变量值并在循环中使用它?

谢谢。

版本:

我试过了:

sqldf(
strwrap(sprintf("
SELECT D.LoadDate,D.DaysRange, D.DaysRangeNext, 
COUNT(*) AS clientes 
FROM data AS D
WHERE D.LoadDate = '%s'
GROUP BY D.LoadDate,D.DaysRange, D.DaysRangeNext
ORDER BY D.DaysRange, D.DaysRangeNext
",i),simplify=TRUE,width=1000000))

但我得到了:

> [1] loaddate      DaysRange     DaysRangeNext clientes      <0 rows>
> (or 0-length row.names)

【问题讨论】:

    标签: r loops variables sqldf


    【解决方案1】:

    fn$sqldf 允许在 sql 语句中使用 $ 来插入 R 变量。请参阅 sqldf github 主页上的示例 5,并查看帮助页面底部 ?fn 了解更多示例。如果我们不需要输出名称,我们可以将 setNames(loaddates, loaddates) 减少到 loaddates

    Map(function(i)
      fn$sqldf("
        SELECT D.LoadDate,D.DaysRange, D.DaysRangeNext, 
        COUNT(*) AS clientes
        FROM data AS D
        WHERE D.loaddate = $i
        GROUP BY D.LoadDate,D.DaysRange, D.DaysRangeNext
        ORDER BY D.DaysRange, D.DaysRangeNext
      "), setNames(loaddates, loaddates))
    

    给予:

    $`2014-03-16`
        loaddate DaysRange DaysRangeNext clientes
    1 2014-03-16         0             0        2
    2 2014-03-16        30            30        1
    3 2014-03-16        60            NA        1
    
    $`2014-04-16`
        loaddate DaysRange DaysRangeNext clientes
    1 2014-04-16         0            30        1
    2 2014-04-16        30            30        1
    

    【讨论】:

      【解决方案2】:

      首先创建一个新的数据框。然后加入它:

      num_Pcode <- as.numeric("3550")
      df_Pcode_0 <- as.data.frame(num_Pcode)
      df_Pcode_0
      ...
      

      返回num_Pcode

      【讨论】:

        【解决方案3】:

        您可以通过在循环内但在函数调用之外定义 SQL 语句来实现此功能。

        for (i in loaddates) {
        
        statement = paste( " SELECT D.LoadDate,D.DaysRange, D.DaysRangeNext,
                      COUNT(*) AS clientes
                      FROM data AS D
                      WHERE D.loaddate = ", i,
        "GROUP BY D.LoadDate,D.DaysRange, D.DaysRangeNext
        ORDER BY D.DaysRange, D.DaysRangeNext " )
        
        sqldf(statement)
        }
        

        【讨论】:

          【解决方案4】:

          变量i 不会在查询中按原样替换。您需要sprintf 为其赋值。 (我也不知道你是否需要考虑断线,但只是为了确保我在下面提供它。也许你不需要 sqldf;在这种情况下只需删除 strwrap)。

          #let's assume loaddates is the following:
          loaddates <- 'something'
          

          根据需要获取查询的一种方法,即不使用换行符并使用i 获取所需的加载日期值:

          strwrap(sprintf("
                          SELECT D.LoadDate,D.DaysRange, D.DaysRangeNext, 
                          COUNT(*) AS clientes
                          FROM deuda AS D
                          WHERE D.loaddate = '%s'
                          GROUP BY D.LoadDate,D.DaysRange, D.DaysRangeNext
                          ORDER BY D.DaysRange, D.DaysRangeNext
                          ",i),simplify=TRUE,width=1000000)
          

          将输出:

          [1] "SELECT D.LoadDate,D.DaysRange, D.DaysRangeNext, COUNT(*) AS clientes FROM deuda AS D WHERE D.CodEmp = 'TGG' and D.loaddate = something GROUP BY D.LoadDate,D.DaysRange, D.DaysRangeNext ORDER BY D.DaysRange, D.DaysRangeNext"
          

          在没有换行符或变量i 未分配的情况下,您需要哪一行。

          在你的循环中应该是:

          for (i in loaddates) {
          
          strwrap(sprintf("
                          SELECT D.LoadDate,D.DaysRange, D.DaysRangeNext, 
                          COUNT(*) AS clientes
                          FROM deuda AS D
                          WHERE D.loaddate = '%s'
                          GROUP BY D.LoadDate,D.DaysRange, D.DaysRangeNext
                          ORDER BY D.DaysRange, D.DaysRangeNext
                          ",i),simplify=TRUE,width=1000000)
          
          }
          

          使用您的数据集:

          library(sqldf)
          data <- read.table(text ="
              loaddate DaysRange DaysRangeNext
          1 2014-03-16        30            30
          2 2014-03-16         0             0
          3 2014-03-16         0             0
          4 2014-03-16        60            NA
          5 2014-04-16        30            30
          6 2014-04-16         0            30
          "
                             ,header = TRUE,stringsAsFactors=F)
          
          loaddates<- unique(sort(data$loaddate))
          
          for (i in loaddates) {
          
            print(sqldf(
            strwrap(sprintf("
                          SELECT D.LoadDate,D.DaysRange, D.DaysRangeNext, 
                          COUNT(*) AS clientes
                          FROM data AS D
                          WHERE D.loaddate = '%s'
                          GROUP BY D.LoadDate,D.DaysRange, D.DaysRangeNext
                          ORDER BY D.DaysRange, D.DaysRangeNext
                          ",i),simplify=TRUE,width=1000000) ))
          }
          

          输出:

              loaddate DaysRange DaysRangeNext clientes
          1 2014-03-16         0             0        2
          2 2014-03-16        30            30        1
          3 2014-03-16        60            NA        1
              loaddate DaysRange DaysRangeNext clientes
          1 2014-04-16         0            30        1
          2 2014-04-16        30            30        1
          

          【讨论】:

          • 它需要在%s 周围加上引号。现在就试试。我更新了。
          • 带引号的结果相同
          • 但我的作品我刚刚运行它!复制粘贴我的示例并检查。你需要print 才能看到它。您也没有在数据集中添加列CodEmp
          • btw loaddate 数据中的列是 character 类型,我使用它的方式。是你的Date 类型吗?
          • 打印是个问题。谢谢。
          猜你喜欢
          • 1970-01-01
          • 2011-11-24
          • 2012-05-07
          • 2013-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-16
          • 1970-01-01
          相关资源
          最近更新 更多