我在创建一个
的循环时遇到了一些麻烦下面是我的示例循环以及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
任何帮助都是最有把握的我是新手一般编写代码所以请原谅我这是一个愚蠢的问题。我在这个主题上搜索了一下,但老实说不太确定如何搜索这个主题。
答案 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)
好的..没有一个可重复的例子,你不清楚你问的是什么。我会怎么做..
lapply
循环创建列表我将列表元素绑定到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