簡體   English   中英

嘗試使用R中的forloop聚合查詢數據

[英]Trying to aggregate Queried data using a forloop in R

我在創建一個循環時遇到了一些麻煩

  1. sqlQueries變量“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

任何幫助都是最有把握的我是一般編寫代碼的新手所以請原諒我這是一個愚蠢的問題。 我在這個主題上搜索了一下,但老實說不太確定如何搜索這個主題。

經過一些調整后,這看起來很棒!

    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. 我打開連接
  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) 

這是資源密集型的,但可以使用。

# 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM