我的数据包含日期(年/月/日),我希望按年汇总数据。我确信有一种更简单的方法可以做到,但我采取的方法是尝试使用" 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还是新手(抱歉基本问题)。
格雷格
答案 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