【问题标题】:R: sorting a data frame by two columns "Year" and "Month"R:按“年”和“月”两列对数据框进行排序
【发布时间】:2016-05-23 21:49:06
【问题描述】:

我有一个数据框 DF,其中有一列 Month 作为字符串,使用月份的全英文名称,一列 Year 作为数字:

Year Month {several xi}        
2016 April {numeric} 

我需要将几个 xi 绘制为时间序列。从最早的月份(2015 年 1 月)到现在,对这个数据框进行排序的最有效方法是什么?我尝试使用as.Date 将“月份”转换为日期分类对象并没有按我的意愿工作;他们不断回来按字母顺序排序。

抱歉,如果这是一个菜鸟问题,但运气不好,我在 R 职业生涯中不必经常使用日期类对象,所以我不确定我看到的各种类似问题中的哪些可以帮帮我。

【问题讨论】:

  • month.name 是一个内置常量,月份顺序正确。只需执行df$Month = factor(df$Month, levels = month.name) 即可创建具有正确排序的因子。然后你可以df[order(df$Year, df$Month), ]
  • 如果没有一天,您将无法将其设为Date - 您可以在当天使用1。您可以使用zoo 包的yearmon 类,几乎完全是as in this question,但您需要使用%B 而不是%m,因为您有未缩写的月份名称。有关其他日期部分通配符,请参阅 ?strptime

标签: r datetime


【解决方案1】:

我同意 Gregor 关于使用 zoo 包的建议。我认为将日期组合成一个变量是一种很好的做法。如果您只需要提取有关年份或月份的信息,您可以使用lubridate 包。这是一个如何使用zoo的简单示例。

library(zoo)

#Toy Data Set
d <- data.frame( Month = c("March", "April", "May", "March"), Year = c("2008", "1998", "1997", "1999"), stringsAsFactors = FALSE)

#Generating Yearmon
d$my <- as.yearmon(paste(d$Month, d$Year)) 

#Ordering the data
d <- d[order(d$my), ]

确保数据框中的月份和年份变量不是因素。它们必须分别属于字符和数字/整数类。

请注意,如果您打算使用ggplot 而不是plot,那么您需要使用scale_x_yearmon()

最后,您提到您在使用as.Date 时遇到了问题。正如 Gregor 所指出的,这是因为 as.Date 需要一种包含日、月和年的格式。因此,在您的情况下,您可以插入任意一天来使用as.Date。例如,as.Date(paste(d$Month, 1, d$Year), "%B %d %Y")。有关不同日期格式的完整列表,请阅读 this

【讨论】:

  • 感谢所有响应者。通过month.name 订购和使用as.Date(paste(d$Month, 1, d$Year), "%B %d %Y") 都像一个魅力。这个文件很大,我已经导入了相当多的包,所以我避免使用zoo,但我会记住它。
猜你喜欢
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多