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