2016-05-09 4 views
0

я работаю над следующим dataframe:Итоговые данные по дате

VAL1 <- c("AA", "BB", "CC", "DD", "BB", "DD", "AA", "DD") 
D01012016 <- c(2, 4, 2, 6, 8, 8, 12, 4) 
D02012016 <- c(3, 3, 2, 1, 1, 2,4, 4) 
D03022016 <- c(2, 2, 3, 4, 3, 5, 5, 7) 
D05022016 <- c(1, 3, 3, 1, 2,3, 3, 6) 
D03032016 <- c(2, 1, 1, 1, 5, 3, 2, 1) 
D01042016 <- c(2, 4, 2, 6, 8, 8, 12, 4) 
D02042016 <- c(3, 3, 2, 1, 1, 2,4, 4) 
D03042016 <- c(2, 2, 3, 4, 3, 5, 5, 7) 
D05042016 <- c(1, 3, 3, 1, 2,3, 3, 6) 
D05052016 <- c(2, 3, 7, 1, 1, 1, 1, 1) 
D23062016 <- c(2, 1, 1, 1, 5, 3, 2, 1) 
D05072016 <- c(1, 3, 3, 1, 2,3, 3, 6) 
D03082016 <- c(2, 1, 1, 1, 5, 3, 2, 1) 
D01092016 <- c(2, 4, 2, 6, 8, 8, 12, 4) 
D12092016 <- c(3, 3, 2, 1, 1, 2,4, 4) 
D05102016 <- c(2, 1, 1, 1, 5, 3, 2, 1) 
D21112016 <- c(2, 4, 2, 6, 8, 8, 12, 4) 
D13122016 <- c(3, 3, 2, 1, 1, 2,4, 4) 
df <- data.frame(D01012016, D02012016, D03022016,D05022016,D03032016,D01042016,D02042016,D03042016,D05042016,D05052016,D23062016,D05072016,D03082016,D01092016,D12092016,D05102016,D21112016,D13122016) 

COLNAMES являются даты в формате Dddmmyyyy, мне нужно сгруппировать данные, mantaining в первом столбце VAL1 (повторяющиеся значения VAL должны оставаться разделены) и группировать его ежемесячные значения (второе colnames on должно быть именем месяца, а данные должны быть агрегированы с помощью функции sum()). Конечный набор данных должен иметь одинаковое количество строк (и все VAL1 должно находиться в одном и том же положении) и иметь только 12 столбцов (один в месяц)

+0

Что вы подразумеваете под агрегированным? Каков ваш ожидаемый результат? Кроме того, должно быть много ответов на агрегирование данных временных рядов в R. – Gopala

+0

@Gopala, Получить один столбец за каждый месяц (в случае монтирования) или по одному за каждый квартал (ежеквартально). Я знаю, я просто новичок с R, и я не нашел ничего, где мне приходилось собирать по кодам, и в каких датах был символ до реальной даты –

+0

@ZheyuanLi, привет! :) Нет, исходный dataframe должен измениться только для числа столбцов, дневные значения должны быть группами по месяцам с помощью sum(). Таким образом, количество строк останется неизменным, но столбцы будут только 12 –

ответ

0

Вот решение, использующее reshape2 (tidyr или reshape can также было б) пакет реформировать свой фрейм данных и библиотеку dplyr суммировать результаты:

df <- data.frame(VAL1, D01012016, D02012016, D03022016,D05022016,D03032016,D01042016,D02042016,D03042016,D05042016,D23062016,D05072016,D03082016,D01092016,D12092016) 

library(reshape2) 
ndf<-melt(df) 
ndf$date<-as.Date(ndf$variable, format="D%d%m%Y") 

library(dplyr) 
summarize(group_by(ndf, VAL1, cut(ndf$date, breaks ="1 month")), sum(value)) 

трудно работать с вашей помощью колонки формата, таким образом, легче конвертировать из широкого формата в длинном формате , VAL1 переносится из команды расплава. Если вас интересуют квартальные результаты, просто измените с 1 месяца перерывов на трехмесячные перерывы.

+0

спасибо, но проблема сложнее, чем кажется, я не могу использовать функцию слияния, потому что мне нужно дублировать данные в первом столбце ... я отредактировал вопрос точнее. –

+0

Хорошо, спасибо, но у меня есть один вопрос: после использования melt() как я могу вернуться к той же структуре первого кадра данных? Такое же количество строк, но только 12 столбцов –

+0

Команда dcast в библиотеке reshape2 может конвертировать из длинного в широкий формат. В зависимости от вашего имени столбца формула будет выглядеть примерно так: dcast (finaldf, VAL1 ~ month) – Dave2e

0

Вот вариант с использованием data.table

library(data.table) 
melt(setDT(df), id.var="VAL1")[, date := as.Date(variable, "D%d%m%Y")][ 
      ,.(Sum=sum(value)) , by = .(VAL1, grp = cut(date, breaks= "1 month"))] 
Смежные вопросы