使用分割,剪切和R中的循环绘制具有day-interval-PNG的2列

时间:2013-02-09 12:48:43

标签: r plot

我有以下数据框:

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

我的想法是data.frame划分为 2天,并使用splitcut函数,然后使用for-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循环部分,并会询问如何继续的线索。

1 个答案:

答案 0 :(得分:1)

这里有一些小错误:

  • 首先,正如朱巴指出dev.off()应该进入循环。
  • 其次,myTableSplitdata.frames的列表。因此,应使用j作为myTableSplit[[j]]来访问这些元素。
  • 第三,x1y1列应在没有j的情况下编入索引。
  • 第四,您的计数器变量twoDayInt只有一个条目(5而不是6)。这导致myTableSplit中的cut未导致全部5个部分,但只有4个。因此,作为修复,我将twoDayInt的范围扩展到2013/01/12然后只为for-loop中的前5个值编制索引(虽然这可以完全不同的方式完成,我想你更想要修复你的代码)。

纠正所有这些错误:

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两行来直接实现您打算实现的目标:< / p>

# 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()
})