我有以下数据框:
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天,然后将x1
与y1
绘制成png
个文件,带有循环所以我最终得到了5 png files
。
我的想法是将data.frame
划分为 2天,并使用split
和cut
函数,然后使用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循环部分,并会询问如何继续的线索。
答案 0 :(得分:1)
这里有一些小错误:
dev.off()
应该进入循环。myTableSplit
是data.frames
的列表。因此,应使用j
作为myTableSplit[[j]]
来访问这些元素。x1
和y1
列应在没有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()
})