【发布时间】:2012-08-21 09:51:22
【问题描述】:
我想为许多不同的时间序列制作季节性箱线图。我希望下面的代码清楚地说明了我想要做什么。
我现在的问题是,如何用尽可能少的代码行以最优雅的方式做到这一点。我可以使用函数“子集”为每个月创建一个新对象,然后绘制它,但这似乎不是很优雅。我尝试使用“拆分”功能,但我不知道如何从那里开始。
如果我的问题没有明确说明,请告诉我或编辑它以使其更清楚。
非常感谢任何直接帮助或与其他网站/帖子的链接。感谢您的宝贵时间。
代码如下:
## Create Data
Time <- seq(as.Date("2003/8/6"), as.Date("2011/8/5"), by = "2 weeks")
data <- rnorm(209, mean = 15, sd = 1)
DF <- data.frame(Time = Time, Data = data)
DF[,3] <- as.numeric(format(DF$Time, "%m"))
colnames(DF)[3] <- "Month"
## Create subsets
Jan <- subset(DF, Month == 1)
Feb <- subset(DF, Month == 2)
Mar <- subset(DF, Month == 3)
Apr <- subset(DF, Month == 4)
## Create boxplot
months <- c("Jan", "Feb", "Mar", "Apr")
boxplot(Jan$Data, Feb$Data, Mar$Data, Apr$Data, ylab = "Data", xlab = "Months", names = months)
## Try with "split" function
DF.split <- split(DF, DF$Month)
head(DF.split)
【问题讨论】:
-
感谢 ROLO 和 James 的快速响应和出色的解决方案。
-
代码在 Win 7 和 R 2.14.1 下不起作用。一些月度值(“%b”)得到了 NA,因此在绘图期间被省略。任何想法为什么会发生,@James?我之前在 Windows 下也遇到过类似的时间函数问题。不过,代码在 Mac OS X 下运行良好!
-
%b的行为取决于当前的语言环境,本质上是试图匹配当地语言的月份缩写;反过来,语言环境的行为往往非常依赖于平台,我怀疑即使是相同的名义语言环境在不同的平台上也会有不同的行为(或者您可能在不同的机器上设置了不同的语言环境)。它不会那么优雅,但您可以使用month.abb(硬编码的英文月份缩写)而不是strftime(...)创建一个解决方案 -
现在,它又可以在 Windows 机器上运行了。我将 Sys.setlocale 更改为 Sys.setlocale("LC_TIME", "English") 并且效果很好。感谢@Ben Bolker。