微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于循环具有唯一值的字符串的 R 函数

如何解决用于循环具有唯一值的字符串的 R 函数

我正在从事一个项目,我必须在一个相对较小的服务器上下载超过 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')")
}

解决方法

使用基本循环

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)

}
,

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

x<-c(20190101,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))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。