从R中的日期数据创建分类变量

时间:2017-01-24 10:16:48

标签: r date categories

我的数据包含日期(年/月/日),我希望按年汇总数据。我确信有一种更简单的方法可以做到,但我采取的方法是尝试使用" cut"来创建一个新的分类变量。功能。

例如:

# create sample dataframe 
dates<-c("01/01/2013", "01/02/2013", "01/01/2014", "01/02/2014", "01/01/2015", "01/02/2015")
cases<-c(3,5,2,6,8,4)
df<-as.data.frame(cbind(dates, cases))
df$dates <- as.Date(df$dates,"%d/%m/%Y")

# categorise by year 
df$year <- cut(df$dates, c(2013-01-01, 2013-12-31, 2014-12-31, 2015-12-31))

这会出错:

invalid specification of 'breaks'

如何告诉R在各种&#34;日期&#34;间隔?我对这一切的处理方法都错了吗? R还是新手(抱歉基本问题)。

格雷格

4 个答案:

答案 0 :(得分:1)

如果您只是寻找这一年,也许这会有所帮助:

df$year <- format(df$dates, format="%Y")

       dates cases year
1 2013-01-01     3 2013
2 2013-02-01     5 2013
3 2014-01-01     2 2014
4 2014-02-01     6 2014
5 2015-01-01     8 2015
6 2015-02-01     4 2015

答案 1 :(得分:1)

一个简单的解决方案是使用dplyr包。这是一个简单的例子:

library(dplyr)

df_grouped <- df %>%
  mutate(
    dates = as_date(dates),
    cases = as.numeric(cases)) %>%
  group_by(year = year(dates)) %>%
  summarise(tot_cases = sum(cases))

mutate语句中,我们将变量转换为更合适的格式,在group_by中我们选择要对哪个变量进行分组,在summarise中我们创建任何新的变量我们想要。

df_grouped看起来像这样:

# A tibble: 3 × 2
   year tot_cases
  <dbl>     <dbl>
1  2013         6
2  2014         6
3  2015         9

答案 2 :(得分:1)

我认为基于cut的解决方案有点矫枉过正。您可以使用year包中的lubridate函数从日期中提取年份:

library(dplyr)
library(lubridate)
df %>% mutate(year = year(dates))
#        dates cases year
# 1 2013-01-01     3 2013
# 2 2013-02-01     5 2013
# 3 2014-01-01     2 2014
# 4 2014-02-01     6 2014
# 5 2015-01-01     8 2015
# 6 2015-02-01     4 2015
在处理时间数据时,

lubridate是一个非常棒的软件包。

构建year列后,您可以应用各种摘要。我在这里使用dplyr样式:

# Note that as.numeric(as.character()) is needed as `cbind` forces `cases` to be a factor
df %>% mutate(year = year(dates), cases = as.numeric(as.character(cases))) %>% 
  group_by(year) %>% summarise(tot_cases = sum(cases))
# # A tibble: 3 × 2
#   year tot_cases
#   <dbl>     <dbl>
# 1  2013         8
# 2  2014         8
# 3  2015        12

请注意group_by确保之后的所有操作都按照那里提到的唯一类别完成,在这种情况下每年。

答案 3 :(得分:0)

你的输出应该如何?

使用as.Date

定义中断时,您的代码有效
breaks <- as.Date(c("2013-01-01", "2013-12-31", "2014-12-31", "2015-12-31"))

# categorise by year 
df$year <- cut(df$dates, breaks)

       dates cases       year
1 2013-01-01     3 2013-01-01
2 2013-02-01     5 2013-01-01
3 2014-01-01     2 2013-12-31
4 2014-02-01     6 2013-12-31
5 2015-01-01     8 2014-12-31
6 2015-02-01     4 2014-12-31

我猜你希望你的变量year看起来不同吗?您可以在使用labels时定义cut

# categorise by year 
df$year <- cut(df$dates, breaks, labels = c(2013, 2014, 2015))

       dates cases year
1 2013-01-01     3 2013
2 2013-02-01     5 2013
3 2014-01-01     2 2014
4 2014-02-01     6 2014
5 2015-01-01     8 2015
6 2015-02-01     4 2015