【问题标题】:Converting a factor time variable to yearmon variable将因子时间变量转换为 yearmon 变量
【发布时间】:2016-07-15 16:23:52
【问题描述】:

我有一个如下所示的数据框,

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 类。 我想将其转换为 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 绘制 yearmon 类对象时遇到的错误如下,

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

【问题讨论】:

  • 请将dput(head(elnino)) 的输出而不是您提供的数据样本粘贴到您的问题中,以便我们获得与您的实际数据结构完全相同的数据样本。另外,请显示与您的问题相关的所有代码(包括 ggplot 代码)以及您收到的任何错误消息。
  • 直接的答案是您传递给as.yearmon 的格式似乎与data.frame 中的格式不匹配。但是,如果没有实际数据,很难做更多的事情。在不知道您要绘制什么的情况下,我无法提出有用的解决方法/方法。
  • try as.yearmon(elnino[,1], "%Y %b") %b 指的是缩写月份,您的列看起来是年、三个空格、缩写月份的格式。引号中的那位是指您正在转换的数据当前采用的格式,而不是您希望它在转换后的方式。
  • @Austin 非常感谢。但是 qplot() 在绘图时仍然不支持 yearmon 类。我该如何解决这个问题?

标签: r ggplot2 zoo


【解决方案1】:

一个简单的替代方法是只使用设置为每月第一天的 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')

【讨论】:

    【解决方案2】:

    正如预测的那样,提供给as.yearmon 的格式与您的数据不匹配。它在年和月之间有三个空格,以缩写形式给出,而不是数字。这应该有效:

    as.yearmon(as.character(elnino[,1]), "%Y   %b")
    

    对于绘图,您是否有理由必须使用yearmon?为什么不能使用更常见的Date 格式或继续将值视为因素(取决于您的需要)。

    【讨论】:

    • 对于绘图,您可以使用scale_x_yearmon
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多