首页 > 解决方案 > 如何在多个数据集上循环执行 SQL 查询?

问题描述

我想简化一些我正在运行的代码。我正在尝试提取 SQL 查询产生的多个数据集的维度。我想尝试遍历数据集名称

我已经能够得到我想要的结果,我只是不确定这是最有效的方法:我为每个数据集都有一个单独的 SQL 查询行。

这是原始代码:

    library(sqldf)
    dim(sqldf("select Group1, count(*) as Count from Data1 group by Group1"))[1]
    dim(sqldf("select Group1, count(*) as Count from Data2 group by Group1"))[1]
    dim(sqldf("select Group1, count(*) as Count from DataN group by Group1"))[1]

这是我简化代码的尝试:

    datalist=c(Data1,Data2,...DataN)
    abc=vector("list",length(datalist))
    for (i in seq_along(datalist))
      abc[[i]]=dim(sqldf("select Group1, count(*) as Count from datalist[i] group by Group1"))[1]

我希望输出显示每个数据集的 N 个数字,但我收到一条错误消息,内容为“没有这样的表:datalist”。

标签: arraysrloopssimplify

解决方案


这是因为字符串中的“datalist[i]”不会被datalist[i]变量的实际值替换,而是传递给 SQL。尝试

datalist=c("Data1", "Data2", ... "DataN")
queries <- sprintf("select Group1, count(*) as Count from %s group by Group1", datalist)
abc <- lapply(queries, function(q) {
           nrow(sqldf(q))
         })

一些补充说明:

  • for用于填充列表,使用lapplywhich 直接生成列表
  • 如果这样做,则无需初始化列表abc <- list()
  • 不要使用dim(x)[1]nrow更明确
  • 如果您的数据始终是“Data1”、“Data2”...等,您也可以这样做

    queries <- sprintf("select Group1, count(*) as Count from Data%d group by Group1", 1:10)
    

推荐阅读