【问题标题】:R function for looping over a string with unique values用于循环具有唯一值的字符串的 R 函数
【发布时间】:2021-06-11 01:53:58
【问题描述】:

我正在做一个项目,我必须在相对较小的服务器上下载超过 1000 万条记录。因此,我不仅要下载整个数据集,还必须以较小的部分下载它。我正在尝试创建一个循环,该循环将根据日期调用批量数据。我习惯于在 Stata 中编码,您可以在其中使用“x”或字符串中的某些变体来调用本地。但是,我找不到在 R 中执行此操作的方法。下面是我正在使用的一小段代码。基本上,每当我尝试运行此 'val' 和 'val2' 时,都不会使用定义列表中的日期进行更新,因此输出的字面意思就像服务器试图在 'val' 和 'val2' 之间搜索,而不是在“20190101”和“20190301”之间。非常感谢任何有关如何解决此问题的建议!

x<-c(20190101, 20190301)
y<-c(20190301, 20190501)
foreach (val=x, val2=y) %do% {
     data<-DBI::dbGetQuery(myconn, "SELECT * FROM .... WHERE (DATE BETWEEN 'val' AND 'val2')")
}

【问题讨论】:

  • 为了让我们帮助您,请编辑您的问题以包含reproducible example。例如,要生成最小数据集,您可以使用head()subset() 或索引。然后使用dput() 给我们一些可以立即放入R 的东西。另外,请确保您知道该怎么做when someone answers your question。更多信息可以在 Stack Overflow 的help center 上找到。谢谢!

标签: r string loops foreach


【解决方案1】:

使用sprintf,您可以构造查询并使用lapply + do.call 将结果组合到一个数据帧中。

x<-c(20190101, 20190301)
y<-c(20190301, 20190501)

input <- sprintf("SELECT * FROM .... WHERE (DATE BETWEEN '%s' AND '%s')", x, y)
result <- do.call(rbind, lapply(input, function(x) DBI::dbGetQuery(myconn, x)))

使用purrr::map_df 会短一些。

result <- purrr::map_df(input, ~DBI::dbGetQuery(myconn, .x))

【讨论】:

    【解决方案2】:

    有一个基本循环

    x<-c(20190101, 20190301)
    y<-c(20190301, 20190501)
    
    data_all = c()
    
    for(i in 1:length(x)){
      
      query = paste0("SELECT * FROM .... WHERE (DATE BETWEEN '",
      x[i],  "' AND '",  y[i], "')")
      
      data <- DBI::dbGetQuery(myconn, query)
      data_all = rbind(data_all, data)
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-07
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 2018-10-03
      相关资源
      最近更新 更多