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

从R中的日期数据创建分类变量,r,date,categories,R,Date,Categories,我有包括日期(dd/mm/yyyy)的数据,我想按年份总结这些数据。我确信有一种更简单的方法可以做到这一点,但我采取的方法是尝试使用“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

我有包括日期(dd/mm/yyyy)的数据,我想按年份总结这些数据。我确信有一种更简单的方法可以做到这一点,但我采取的方法是尝试使用“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))
我如何告诉R以不同的“日期”间隔剪切?我对这一切的态度都错了吗?对R来说还是个新手(对这个基本问题感到抱歉)


Greg

您的输出应该是什么样子

当您使用
将中断定义为.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

如果你只是在寻找这一年,也许这有助于:


df$year一个简单的解决方案是使用
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))

我认为基于
cut
的解决方案有点过头了。您可以使用
lubridate
软件包中的
year
功能从日期提取年份:

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
在处理时间数据方面是一个非常棒的软件包

构建
年份
列后,您可以应用各种摘要。我在这里使用
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
#注意,as.numeric(as.character())是必需的,因为'cbind'强制'cases'成为一个因子
df%>%变异(年=年(日期),案例=作为.数字(作为.字符(案例)))%>%
按(年度)分组%>%总结(总病例数=总病例数)
##A tibble:3×2
#全年合计个案
#        
# 1  2013         8
# 2  2014         8
# 3  2015        12

请注意,
groupby
确保此后的所有操作都按照此处提到的唯一类别进行,在本例中为每年。

您的
breaks
参数是错误的。输入应该是字符串(可能有效),或者可以使用字符串轻松构造的日期对象(请参见Leo P.的答案)。请注意,cbind确保
大小写
成为字符而不是数字。请注意,解决方案的结果不正确。
df
中的
cases
列是一个因素。对其调用
as.numeric
不会从中创建正确的数字,而是给出因子级别的基本类别ID。您需要调用
as.numeric(as.character())
以确保结果正确。有关正确的解决方案,请参阅我的答案。此外,您发布的输出中缺少2015。
library(dplyr)

df_grouped <- df %>%
  mutate(
    dates = as_date(dates),
    cases = as.numeric(cases)) %>%
  group_by(year = year(dates)) %>%
  summarise(tot_cases = sum(cases))
# A tibble: 3 × 2
   year tot_cases
  <dbl>     <dbl>
1  2013         6
2  2014         6
3  2015         9
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
# 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