0

ループを作成するのに少し問題があります

  1. sql 変数「sensorname」内のすべてのデバイスにクエリを実行します (これは約 30 要素ですが、将来的に増加する予定です)
  2. デバイスクエリに関連付けられたデータテーブルを取得し、それを別のデータフレーム「data1」に入れますが、追加し続けます。

以下は、私のサンプル ループと、「正しい」が完全ではない data1 のサンプルです。LSF20_3a0925 は、変数 sensorname の最後の要素であるため、基本的にループは最後に実行されるまで、変数 data1 のデータを上書きするたびに 30 回実行されます。

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

これはリソースを大量に消費しますが、機能します。

# 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 に答える
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 に答える