首页 文章

如何将我的日期变量分组到R中的月/年?

提问于
浏览
9

我有一个“日期”向量,其中包含以mm / dd / yyyy格式表示的日期:

head(Entered_Date,5)
[1] 1/5/1998 1/5/1998 1/5/1998 1/5/1998 1/5/1998

我试图根据日期绘制频率变量,但我想按月或年分组日期 . 就像现在一样,每天有一个频率,但我想按月或年绘制频率 . 因此,对于1/5/1998,1为1/7/1998和3为1/8/1998,频率为1,我想将其显示为1为1/1998 . 这是一个相对较大的数据集,从1998年到现在的日期,我想找到一些自动化的方法来实现这一目标 .

> dput(head(Entered_Date))
structure(c(260L, 260L, 260L, 260L, 260L, 260L), .Label = c("1/1/1998", 
"1/1/1999", "1/1/2001", "1/1/2002", "1/10/2000", "1/10/2001", 
"1/10/2002", "1/10/2003", "1/10/2005", "1/10/2006", "1/10/2007", 
"1/10/2008", "1/10/2011", "1/10/2012", "1/10/2013", "1/11/1999", 
"1/11/2000", "1/11/2001", "1/11/2002", "1/11/2005", "1/11/2006", 
"1/11/2008", "1/11/2010", "1/11/2011", "1/11/2012", "1/11/2013", 
"1/12/1998", "1/12/1999", "1/12/2001", "1/12/2004", "1/12/2005", ...

5 回答

  • 1

    以下是使用 dplyr 的示例 . 您只需在 format 语句中使用月份 %m 或年份 %Y 的相应日期格式字符串 .

    set.seed(123)
    df <- data.frame(date = seq.Date(from =as.Date("01/01/1998", "%d/%m/%Y"), 
                                     to=as.Date("01/01/2000", "%d/%m/%Y"), by="day"),
                     value = sample(seq(5), 731, replace = TRUE))
    
    head(df)
            date value
    1 1998-01-01     2
    2 1998-01-02     4
    3 1998-01-03     3
    4 1998-01-04     5
    5 1998-01-05     5
    6 1998-01-06     1
    
    library(dplyr)
    
    df %>%
    mutate(month = format(date, "%m"), year = format(date, "%Y")) %>%
    group_by(month, year) %>%
    summarise(total = sum(value))
    
    Source: local data frame [25 x 3]
    Groups: month [?]
    
       month  year total
       (chr) (chr) (int)
    1     01  1998   105
    2     01  1999    91
    3     01  2000     3
    4     02  1998    74
    5     02  1999    77
    6     03  1998    96
    7     03  1999    86
    8     04  1998    91
    9     04  1999    95
    10    05  1998    93
    ..   ...   ...   ...
    
  • 18

    来自lubridate的floor_date做得很好 .

    data %>% 
        group_by(month=floor_date(date, "month")) %>%
        summarize(summary_variable=sum(value))
    

    感谢Roman Cheplyaka

    https://ro-che.info/articles/2017-02-22-group_by_month_r

  • 1

    也许您只需在数据中添加一列,如下所示:

    Year <- format(as.Date(Entered_Date, "%d/%m/%Y"), "%Y")

  • 0

    不需要 dplyr . 看看 ?as.POSIXlt

    df$date<-as.POSIXlt(df$date)
    mon<-df$date$mon
    yr<-df$date$year
    monyr<-as.factor(paste(mon,yr,sep="/"))
    df$date<-monyr
    

    不需要使用 ggplot2 但它很适合这种事情 .

    c <- ggplot(df, aes(factor(date)))
    c + geom_bar()
    

    如果你想看到实际的数字

    aggregate(. ~ date,data = df,FUN=length )
    df2<-aggregate(. ~ date,data = df,FUN=length )
    df2
        date value
    1   0/98    31
    2   0/99    31
    3   1/98    28
    4   1/99    28
    5  10/98    30
    6  10/99    30
    7  11/97     1
    8  11/98    31
    9  11/99    31
    10  2/98    31
    11  2/99    31
    12  3/98    30
    13  3/99    30
    14  4/98    31
    15  4/99    31
    16  5/98    30
    17  5/99    30
    18  6/98    31
    19  6/99    31
    20  7/98    31
    21  7/99    31
    22  8/98    30
    23  8/99    30
    24  9/98    31
    25  9/99    31
    
  • 4

    使用cut()函数有一种超级简单的方法:

    list = as.Date(c("1998-5-2", "1993-4-16", "1998-5-10"))
        cut(list, breaks = "month")
    

    你会得到这个:

    [1] 1998-05-01 1993-04-01 1998-05-01
        62 Levels: 1993-04-01 1993-05-01 1993-06-01 1993-07-01 1993-08-01 ... 1998-05-01
    

相关问题