【问题标题】:Reorganizing data by date and count in r按日期重组数据并在r中计数
【发布时间】:2018-05-02 18:26:39
【问题描述】:

我的数据如下所示:

> head(z, 10)
         date year      long      lat
1  01/18/2017 2017 -92.48474 29.76465
2  01/22/2017 2017 -93.11126 29.83961
3  12/28/2013 2013 -91.30789 29.41938
4  01/08/2014 2014 -93.09949 29.80632
5  01/03/2014 2014 -90.55703 29.44535
6  12/31/2013 2013 -90.39836 29.57244
7             2013 -93.56322 30.30028
8  11/24/2013 2013 -93.45932 29.78530
9  11/19/1994 1994 -93.58333 29.75000
10 11/15/2013 2013 -89.16171 29.45222

在某些日子有多个条目,而有些条目没有日期。那些没有我不感兴趣的日期的人。我想知道的是每个日期有多少记录,并在没有创建记录时插入缺失的日期,因此每个日期都有一个记录年份是否记录数据,例如:

> head(z2)
     m_d y_2017 y_2016 y_2015 y_2014 y_2013
1 01-02     16     15      0     29      9
2 01-03      0     38     25     10      3
3 01-04     13     20     14      5      7
4 01-05     19      0      3      0     16
5 01-06     34     25     29     33     24
6 01-07      3     10      5     34      7

使用聚合函数,我已经能够计算出每天有多少条记录。

> #create a value for the aggregate function to sum
z$count<-rep(1, length(z$year))
m<-aggregate(count ~ date, data = z, sum)
> head(m)
            date count
1                  308
2     01/01/1980     1
3     01/01/1985     1
4     01/01/1995     1
5     01/01/1996     2
6     01/01/1997     1

我不知道如何从这个表格(我需要的信息)以一种足智多谋的方式变成我想要的格式。我可以按年份手动进行子集化,并将每年的数据与该年的完整月/日合并,然后使用所有不同的年份创建一个新的df,但这似乎过于繁琐和重复,因为我有数据回到 1980 年。有人知道将这些数据重组为上述格式的有效方法吗?

【问题讨论】:

    标签: r reorganize


    【解决方案1】:

    您可以轻松地创建一个包含从 1980 年至今的所有日期的参考数据框:

    df$date <- as.Date(df$date, format = "%m/%d/%Y")
    all_dates <- seq(from = as.Date("1980-01-01"), to = as.Date("2018-05-02"), by = 'days'))
    ref_dates = data.frame(date = all_dates)
    
    df <- merge(df, ref_dates, all.y = TRUE)
    df$date <- substring(df$date, 6,10)  # remove year from date column
    
    df_table <- table(df$date, df$year) # cross tab
    final_df <- as.data.frame.matrix(df_table) # convert into dataframe if you like
    

    【讨论】:

    • 这很棒!也感谢您的清晰注释!
    【解决方案2】:

    如果我正确理解您的问题,我会使用 tidyr 包中的 separate() 将“日期”列拆分为“m_d”和“年份”。然后,使用同一包中的gather() 将这个长表更改为更宽。这一步之后,你可以得到一个colnames 'm_d', 'y_2017', 'y_2016'的数据框......你可以稍后再做sum(length())进行计数。

    【讨论】:

      【解决方案3】:

      使用基础 R:

      d=transform(aggregate(long~date+year,dat,length),date=format(strptime(date,"%m/%d/%Y"),"%m-%d"),count=long,long=NULL)
      > as.data.frame.matrix(xtabs(count~date+year,d))
            1994 2013 2014 2017
      01-03    0    0    1    0
      01-08    0    0    1    0
      01-18    0    0    0    1
      01-22    0    0    0    1
      11-15    0    1    0    0
      11-19    1    0    0    0
      11-24    0    1    0    0
      12-28    0    1    0    0
      12-31    0    1    0    0
      

      【讨论】:

        猜你喜欢
        • 2015-07-28
        • 2021-11-10
        • 1970-01-01
        • 1970-01-01
        • 2019-04-15
        • 2020-11-05
        • 1970-01-01
        • 1970-01-01
        • 2019-02-16
        相关资源
        最近更新 更多