2017-01-24 9 views
1

У меня есть данные, которые включают даты (дд/мм/гггг) и я хочу суммировать данные по годам. Я уверен, что есть более простой способ сделать это, но маршрут, который я предпринял, - это попытаться создать новую категориальную переменную, используя функцию «вырезать».Создайте категориальную переменную из данных даты в R

Например:

# 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 вырезать различные интервалы "дата"? Является ли мой подход к этому неправильным? Еще новичок в R (извините за основной вопрос).

Greg

+0

Ваш аргумент 'breaks' неверен. Ввод должен быть либо строками (которые могут работать), либо объектами даты, которые могут быть легко сконструированы с использованием строк (см. Ответ Leo P.). –

+0

Обратите внимание, что cbind гарантирует, что 'cases' станет символом, а не числовым. –

ответ

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 
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

Простое решение будет использование 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 
+0

Обратите внимание, что результат вашего решения неверен. Столбец 'cases' в' df' является фактором. Вызов 'as.numeric' на нем не приведет к созданию правильного номера из него, но даст базовый идентификатор категории фактора. Вам нужно вызвать 'as.numeric (as.character())' для обеспечения правильного результата. См. Мой ответ для правильного решения. Кроме того, вы потеряли 2015 в выпуске, который вы опубликовали. –

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 гарантирует, что все операции, после того, что сделано в уникальной категории, указанной там, в этом случае в год.

 Смежные вопросы

  • Нет связанных вопросов^_^