1

我有以下数据框:

myDates <- seq(as.Date("2013/1/1"), as.Date("2013/1/10"), "days");        
x1 <- 1:10
y1 <- 11:20
myTable <- data.frame(myDates, x1, y1)

现在我的目标是将日期划分为 2 天的时间间隔,然后将它们绘制x1y1文件png中,也许有一个循环,这样我最终得到5 png files.

我的想法是分成 2 天的data.frame间隔,使用splitcut函数,然后使用 afor-loop逐个绘制不同的级别,如下所示:

twoDayInt <- seq(as.Date("2013/01/01"), as.Date("2013/01/10"), by = "2 days")
myTableSplit <- split(myTable, cut(myTable$myDates, twoDayInt))
for (j in 1:length(twoDayInt)) {
    fileName <- sprintf("/home/kigode/Desktop/%s_2dayInteval_%02i.png ", "myGraph",j) 
    png(fileName,width=700,height=650)
    # this is where i cant figure out what to put
    plot(myTableSplit$x1[j], myTableSplit$y1[j])
}
dev.off()  

现在我被困在 for 循环部分,并要求提供有关如何继续的线索。

4

1 回答 1

1

这里有很多小错误:

  • 首先,正如 juba 指出的那样,dev.off()应该进入循环内部。
  • 其次,myTableSplit是一个列表data.frames。因此,应该使用jas访问元素myTableSplit[[j]]
  • 第三,x1andy1列应该在没有j.
  • 第四,您的计数器变量twoDayInt少了一个条目(5 而不是 6)。这导致不会myTableSplit产生cut所有 5 个部分,而只有 4 个。因此,作为修复,我已将范围扩展twoDayInt到直到2013/01/12,然后仅索引中的前 5 个值for-loop(尽管这可以以完全不同的方式完成方式,我想你宁愿想要修复你的代码)。

纠正所有这些错误:

myDates <- seq(as.Date("2013/1/1"), as.Date("2013/1/10"), "days")
x1 <- 1:10
y1 <- 11:20

myTable <- data.frame(myDates, x1, y1)
# note the end date change here
twoDayInt <- seq(as.Date("2013/01/01"), as.Date("2013/01/12"), by = "2 days")
myTableSplit <- split(myTable, cut(myTable$myDates, twoDayInt))
# index 1:5, not the 6th value of twoDayInt
# you could change this to seq_along(myTableSplit)
for (j in head(seq_along(twoDayInt), -1)) {
    fileName <- sprintf("/home/kigode/Desktop/%s_2dayInteval_%02i.png", "myGraph",j) 
    png(fileName,width=700,height=650);
    # [[.]] indexing for accessing list and $x1 etc.. for the column of data.frame
    plot(myTableSplit[[j]]$x1, myTableSplit[[j]]$y1)
    dev.off() # inside the loop
}

编辑:作为替代方案,您打算做的事情可以通过一次使用lapply和拾取data.frame两个行来直接实现:

# here, the number 1,3,5,7,9 are given to idx 1-by-1
lapply(seq(1, nrow(myTable), by=2), function(idx) {
    fileName <- sprintf("/home/kigode/Desktop/%s_2dayInteval_%02i.png", "myGraph",idx) 
    png(fileName,width=700,height=650);
    plot(myTable$x1[idx:(idx+1)], myTable$y1[idx:(idx+1)])
    dev.off()
})
于 2013-02-09T13:12:57.560 回答