按日期重组数据并在 r 中计数
Reorganizing data by date and count in r
我的数据如下所示:
> 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
有些日子有多个条目,而有些条目没有日期。那些没有日期的我不感兴趣。我想知道每个日期有多少条记录,并插入缺失的天数,当 none 条记录被创建时,所以每天都有一条记录是否记录数据的每一年的年份,例如:
> 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
我不知道如何从这个 table,这是我需要的信息,以足智多谋的方式转变为我想要的格式。我可以手动按年进行子集化,并将每年的数据与该年的一整套 months/days 合并,然后使用所有不同的年份创建一个新的 df
,但这似乎过于繁琐和重复,因为我的数据可以追溯到 1980 年。有人知道将这些数据重组为上述格式的有效方法吗?
如果我正确理解你的问题,我会使用 tidyr
包中的 separate()
将 'date' 列拆分为 'm_d' 和 'year'。然后,使用同一包中的 gather()
将这个长 table 更改为更宽。在这一步之后,你可以得到一个colnames为'm_d'、'y_2017'、'y_2016'的数据框......你可以稍后做sum(length())
来进行计数。[=14] =]
使用基础 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
您可以轻松创建包含 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
我的数据如下所示:
> 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
有些日子有多个条目,而有些条目没有日期。那些没有日期的我不感兴趣。我想知道每个日期有多少条记录,并插入缺失的天数,当 none 条记录被创建时,所以每天都有一条记录是否记录数据的每一年的年份,例如:
> 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
我不知道如何从这个 table,这是我需要的信息,以足智多谋的方式转变为我想要的格式。我可以手动按年进行子集化,并将每年的数据与该年的一整套 months/days 合并,然后使用所有不同的年份创建一个新的 df
,但这似乎过于繁琐和重复,因为我的数据可以追溯到 1980 年。有人知道将这些数据重组为上述格式的有效方法吗?
如果我正确理解你的问题,我会使用 tidyr
包中的 separate()
将 'date' 列拆分为 'm_d' 和 'year'。然后,使用同一包中的 gather()
将这个长 table 更改为更宽。在这一步之后,你可以得到一个colnames为'm_d'、'y_2017'、'y_2016'的数据框......你可以稍后做sum(length())
来进行计数。[=14] =]
使用基础 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
您可以轻松创建包含 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