0

我在创建一个循环时遇到了一些麻烦

  1. sql查询变量“sensorname”中的每个设备(这大约是30个元素,但将来会增加)
  2. 获取与设备查询关联的数据表并将其放入单独的数据框“data1”中,但会不断添加。

下面是我的示例循环和 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

任何帮助都会非常感激我一般是编写代码的新手,所以如果这是一个愚蠢的问题,请原谅我。我在这个主题上搜索了一些,但老实说不太确定如何搜索这个主题。

4

3 回答 3

2

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

    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 它应该在每个列表或特定列表中绘制数据。如果有人想使用可重现的东西,我有一个工作历史的保存文件。

于 2013-02-26T21:16:24.503 回答
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)
    
于 2013-02-15T21:52:09.723 回答
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
于 2013-02-15T21:55:54.737 回答