2013-02-15 39 views
0

我有麻烦创建一个循环一点点使用for循环聚集查询的数据即尝试中的R

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

任何帮助将是最appretiated我是新来的,一般写代码,所以请原谅我,如果这是一个愚蠢的问题。我在这个主题上搜索了一下,但是老实说不太清楚如何搜索这个主题。

+0

你是[ZdWhite](http://stackoverflow.com/q/14886576/324364)?如果是这样,请不要在新帐户下重新发布问题。 – joran 2013-02-15 21:42:24

+1

我试图找到我的问题,并假定它没有正确发布。我不是指垃圾邮件,我会删除另一个,因为它是不完整的。 – ZDwhite 2013-02-15 21:46:21

+1

好的...我标记了一个版主要查看的两个问题,所以如果这两个帐户也为您自动合并,请不要感到惊讶。 (你不需要做任何事情,MOD会照顾它。) – joran 2013-02-15 21:48:52

回答

0

好吧,没有一个可重复的例子,它不清楚你问什么。在这里我将如何做到这一点..

  1. 我打开连接使用lapply创建一个列表
  2. 我关闭
  3. 我绑定列表元素融入data.frame连接

  4. 我循环。我假设你有不同的传感器表的相同列。

    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) 
    
+0

@ user1978377你需要这个答案吗? – agstudy 2013-02-18 23:32:36

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

+0

除非你回答自己的问题(没问题),否则你应该补充说明,作为对问题的后续编辑,并对提供所需指导的用户进行评分。 – Mogsdad 2013-02-26 21:39:36

+0

我并不完全确定如何做到这一点。我尝试了正确的回应,但它不允许我,它只允许我向已根据答案启动线索的人添加评论。对不起,我是非常新的堆栈流 – ZdWhite 2013-02-26 23:34:50

+0

您是否知道,您可以使用以下步骤合并您的帐户:http://stackoverflow.com/help/user-merge – Kev 2013-02-27 02:51:47