我有一个数据框,如下所示,
head(elnino)
YEAR..MONTH NINO.3 NINO.3.4 rainfall
1 1950 Jan -1.28 -1.34 5.8
2 1950 Feb -1.10 -1.25 17.8
3 1950 Mar -0.92 -1.16 22.4
4 1950 Apr -0.75 -1.01 8.0
5 1950 May -0.47 -0.75 44.0
6 1950 Jun -0.49 -0.74 146.8
现在第一列即YEAR..MONTH属于FACTOR类。 我想将它转换为class yearmon。但我正在获得NA,如下所示,
as.yearmon(elnino[,1], "%Y-%m")
NA
此外ggplot在绘图时不支持yearmon类。
因此有人可以告诉我如何处理这种类型的日期吗?
数据如下,
dput(head(elnino))
structure(list(YEAR..MONTH = c("1950 Jan", "1950 Feb", "1950 Mar",
"1950 Apr", "1950 May", "1950 Jun"), NINO.3.ANOM = c(-1.28,
-1.1, -0.92, -0.75, -0.47, -0.49), NINO.3.4.ANOM = c(-1.34, -1.25,
-1.16, -1.01, -0.75, -0.74), rainfall = c(5.8, 17.8, 22.4, 8,
44, 146.8)), .Names = c("YEAR..MONTH", "NINO.3.ANOM", "NINO.3.4.ANOM",
"rainfall"), row.names = c(NA, 6L), class = "data.frame")
此外,用ggplot绘制年级类对象时得到的错误如下,
qplot(YEAR..MONTH,rainfall,data = elnino,geom="line")
Don't know how to automatically pick scale for object of type yearmon. Defaulting to continuous
Error: Discrete value supplied to continuous scale
答案 0 :(得分:3)
一个简单的替代方法是只使用设置为本月第一天的Date类而不是zoo :: yearmon:
elnino$month <- as.Date(paste(elnino$YEAR..MONTH, '01'), '%Y %b %d')
qplot(month, rainfall, data = elnino, geom = "line")
该行将是相同的,并且ggplot知道如何在没有更多工作的情况下很好地格式化轴。如果您想添加年份,请使用scale_x_date
:
qplot(month,rainfall,data = elnino,geom="line") + scale_x_date(date_labels = '%b %Y')
答案 1 :(得分:2)
正如预测的那样,提供给as.yearmon
的格式与您的数据不符。它在年和月之间有三个空格,以缩写而不是数字给出。这应该有效:
as.yearmon(as.character(elnino[,1]), "%Y %b")
对于绘图,您是否有必要使用yearmon
?为什么不能使用更常见的Date
格式或继续将值视为因素(取决于您的需求)。