尝试使用R中的for循环聚合查询数据

时间:2013-02-15 20:47:37

标签: r for-loop

我在创建一个

的循环时遇到了一些麻烦
  1. sqlQueries变量“sensorname”中的每个设备(这大约是30个元素,但将来会增加)
  2. 获取与设备查询关联的数据表,并将其放入单独的数据框“data1”中,但不断添加到其中。
  3. 下面是我的示例循环以及data1看起来像“正确”但不完整的示例。 LSF20_3a0925是变量sensorname中的最后一个元素,所以基本上每次循环运行30次,覆盖变量data1中的数据,直到它最后一次运行。

    library(RODBC)
    
      ch <- odbcConnect("SweetLab", uid='---', pwd='------')
      sqlQuery(ch, "use SweetDatabase")     
      sensorname <- sqlQuery(ch,paste("SELECT site_device.code 
                                       FROM site_device, device 
                                       WHERE site_device.did=device.id AND
                                       device.name='LSF20' 
                                       LIMIT 0, 1000;",
                                 sep="")
                              )
    for(k in 1:length(sensorname[[1]])){
      sqlQuery(ch, "use SweetAnalysis")  
      sql <- na.omit(sqlQuery(ch,paste("select * From ",sensorname[[1]][k],"_Events",sep="")));
      if (is.null(sql))
      {return(NULL)}
      data1 <- merge(sensorname[[1]][k],sql)
    }
    
     #############################################
     data1
           x      row_names PeaksP1Time PeaksP1
     1  LSF20_3a0925    24  1346781683  5.076920
     2  LSF20_3a0925    31  1358444323  0.043240
     3  LSF20_3a0925    13  1358444463  0.133170
     4  LSF20_3a0925    12  1358445120  5.286443
    

    任何帮助都是最有把握的我是新手一般编写代码所以请原谅我这是一个愚蠢的问题。我在这个主题上搜索了一下,但老实说不太确定如何搜索这个主题。

3 个答案:

答案 0 :(得分:1)

经过一些调整后,这看起来很棒!

    library(RODBC)
     ch <- odbcConnect("SweetLab", uid='***', pwd='******') 
    sqlQuery(ch, "use SweetDatabase")     
    sensorname <- sqlQuery(ch,paste("select site_device.code from site_device, device where site_device.did=device.id and device.name='LSF20' LIMIT 0, 1000;",sep=""));   
    sqlQuery(ch, "use SweetAnalysis") 
    Datalist <- lapply(sensorname[[1]],function(x){
     query <- paste("SELECT PeaksP1Time,PeaksP1  FROM ",x,"_Events",sep="")
     dat <- (na.omit(sqlQuery(ch,query)))
     data2.nlist<-list(device=x,data=dat)
names(Datalist)<-sensorname$code[1:30]     
 })
    close(ch)

看看这个列表的结构我得到了

> str(Datalist[1:3]) 
List of 3
 $ LSF20_39ecf7:List of 1
  ..$ :'data.frame':    306 obs. of  2 variables:
  .. ..$ PeaksP1Time: num [1:306] 1.35e+09 1.35e+09 1.35e+09 1.35e+09 1.35e+09 ...
  .. ..$ PeaksP1    : num [1:306] 4.5 4.379 0.706 3 0 ...
 $ LSF20_39cd3e:List of 1
  ..$ :'data.frame':    202 obs. of  2 variables:
  .. ..$ PeaksP1Time: num [1:202] 1.35e+09 1.35e+09 1.35e+09 1.35e+09 1.35e+09 ...
  .. ..$ PeaksP1    : num [1:202] 0.664 3.235 5.765 4.636 2.936 ...
  .. ..- attr(*, "na.action")=Class 'omit'  Named int [1:24] 203 204 205 206 207 208 209 210 211 212 ...
  .. .. .. ..- attr(*, "names")= chr [1:24] "203" "204" "205" "206" ...
 $ LSF20_3a09ac:List of 1
  ..$ :'data.frame':    42 obs. of  2 variables:
  .. ..$ PeaksP1Time: num [1:42] 1.35e+09 1.35e+09 1.35e+09 1.35e+09 1.35e+09 ...
  .. ..$ PeaksP1    : num [1:42] 5.589 2.897 2.713 1.706 0.831 ...

现在,我正在进入下一阶段,即同时绘制多个集合。

我的问题是如何告诉R它应该在每个列表或特定列表中绘制数据。如果有人想要使用可重复的东西,我有一个工作历史的保存文件。

答案 1 :(得分:0)

好的..没有一个可重复的例子,你不清楚你问的是什么。我会怎么做..

  1. 我打开连接
  2. 我使用lapply循环创建列表
  3. 我关闭连接
  4. 我将列表元素绑定到data.frame中。我假设你有不同传感器表的相同列。

     ch <- odbcConnect("SweetLab", uid='---', pwd='------')
     ll <- lapply(sensorname[[1]],function(x){
        query <- paste("SELECT *  FROM ",x,"_Events",sep="")
        dat <- na.omit(sqlQuery(ch,query))
        data.frame(sensor=x,dat)
     })
     close(ch)
     data1 <- do.call(rbind,ll)
    

答案 2 :(得分:0)

这是资源密集型的,但可以使用。

# before your for loop
results <- list()

#inside your for loop 
for (k ......) {
  ....
  ....
  results[[k]] <- sql
}


# after your for loop

Data1 <- do.call(rbind, results)   # if same schema
   # OR
Data1 <- do.call(merge, results)   # if different schema