如何绘制时间数据的子集?

3

我有输入数据,并对其进行子集处理,只查看CODE列中输入为4或5的行。接下来,我对这些数据进行了进一步的子集处理,以便能够查看特定的物种。然后,我确保DATE列中的条目被读取为日期,而不是因素(这是默认设置)。然后,我将其中两列绘制在同一图表中:

ph<-read.csv(url("http://luq.lternet.edu/data/lterdb88/data/Lfdp1-ElVerdePhenology.txt"))
ftsd<-subset(ph, ph$CODE %in% c("4","5"))
DACEXC<-subset(ftsd, ftsd$SPECIES %in% "DACEXC")
DACEXC$DATE<-as.Date(DACEXC$DATE, format="%m/%d/%y")
plot(DACEXC$DATE,DACEXC$NUMBER)

数据从1992年到2007年,我希望逐年绘制。我会为很多物种做这个操作,但我不知道该如何实现。我试过很多方法,包括限制x轴或只选择一年的子集,但都没有成功。我尝试了以下几个想法:

plot(DACEXC$DATE,DACEXC$NUMBER, xlim=c(1992,1993))
plot(DACEXC$DATE,DACEXC$NUMBER, xlim=c(01/01/1992,12/31/1992))
plot(DACEXC$DATE,DACEXC$NUMBER, xlim=c(1992:1993))

DACEXC92<-subset(DACEXC92, DATE==1992)
DACEXC92
[1] DATE    BASKET  SPECIES CODE    NUMBER 
<0 rows> (or 0-length row.names)

上述代码和下面的代码都返回一个空数据框,我尝试使用条件参数来解决问题,但都没有成功。
DACEXC92<-subset(DACEXC92, DATE==04/01/92)
DACEXC92
[1] DATE    BASKET  SPECIES CODE    NUMBER 
<0 rows> (or 0-length row.names)

有没有办法仅绘制一年的图表,或者如何创建每年的子集?


我重新修改了你的问题标题,以便更准确地描述你所问的内容。这个网站也作为一个搜索参考,因此清晰的标题有助于人们找到他们想要的答案。 - Joris Meys
2个回答

4

将日期转换为正确的DateTimeClass(POSIXct或Date),然后使用该类可用的工具。

 DACEXC$DATE <- as.POSIXct(strptime(DACEXC$DATE, "%Y-%m-%d"))

(as.Date(DACEXC$DATE)as.POSIXct(DACEXC$DATE)可能可以使用,但我喜欢显式地执行它,因为当使用不同的格式时更容易理解出错了什么)。

从POSIXlt表示中提取年份组件,并将其等同于特定的年份:

 with(DACEXC[as.POSIXlt(DACEXC$DATE)$year + 1900 == 1993, ], plot(DATE, NUMBER))

或者在一定的年份范围内:

with(DACEXC[as.POSIXlt(DACEXC$DATE)$year + 1900 %in% 1993:1995, ], 
     plot(DATE, NUMBER))

一旦数据处于良好的DateTime格式,您有许多选项,包括使用字符表示进行子集操作,例如format(DACEXC$DATE, "%Y") == "1993"

有关格式详细信息,请参见?strptime,有关全局信息,请参见?DateTimeClasses


3

请确保您的xlim值为日期:

with(DACEXC,
  plot(DATE,NUMBER, 
     xlim=as.Date(c("1992-01-01","1992-12-31"))
  )
)

这将得到:

enter image description here

请注意,这只改变了xlim,所以下一年的数据仍然可见。如果您想处理年份,则还可以使用chron包:

library(chron)
DACEXC92 <- DACEXC[years(DACEXC$DATE)==1992,]
with(DACEXC92,plot(DATE,NUMBER))

这将为您提供所需的数据框:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接