2016-10-20 4 views
1

у меня есть фрейм данных с данными для макс 2-х лет период на различных объектах:R сюжетных месяцев в течение первых 2 лет

ISBN Date  Quantity 
3457 2004-06-15 10 
3457 2004-08-16 6 
3457 2004-08-19 10 
3457 2005-04-19 7 
3457 2005-04-20 12 
9885 2013-01-15 10 
9885 2013-03-16 6 
9855 2013-08-19 10 
9885 2014-09-19 7 
9885 2014-09-20 12 

Как я могу построить Jan to Dec для года, продолжила Jan to Dec для 2-й год? Я предполагаю, что идея состоит в том, чтобы нормализовать годы (иметь 1-й, 2-й), но не месяцы. (вот пример) Number of Items Sold over 2 Years Period Since Release

+0

Не могли бы вы предоставить 'dput()' ваших данных? –

+0

@ StevenBeaupré вот образец (он огромен): 'структура (список (ISBN = c (9164203816, 9164203816, 9164203816), Title = structure (c (1L, 1L, .... 2L, 1L ... 2L), .Label = c ("Det xE4r nxE5got som inte stxE4mmer", "LxE4r dig leva: Mindre stress -", ​​"xD6pnas i hxE4else av min dxF6d ), class = «коэффициент»), Qty = c (0L, 0L, ... 1L ... 0L ... 30L..1L..80L .. 1L), SaleDate = структура (c (1430200783.59, ...., 1104322312.383), class = c ("POSIXct", "POSIXt" ), tzone = "")), .Names = c ("ISBN", "Title", "Qty", "SaleDate" ), row.names = c (NA, 31745L), class = "data.frame") ' – adlisval

ответ

0

Вы можете попробовать:

data <- df %>% 
    group_by(ISBN) %>% 
    arrange(Date) %>% 
    mutate(Year = year(Date), 
     Month = month(Date, label = TRUE), 
     Rank = paste(sapply(cumsum(Year != lag(Year,default=0)), toOrdinal), "Year")) %>% 
    group_by(Rank, Month, add = TRUE) %>% 
    summarise(Sum = sum(Quantity)) 

ggplot(data = data, aes(x = Month, y = Sum, 
         group = factor(ISBN), 
         colour = factor(ISBN))) + 
    geom_line(stat = "identity") + 
    facet_grid(. ~ Rank) + 
    scale_colour_discrete(name = "ISBN") + 
    theme(panel.margin = unit(0, "lines"), 
     axis.text.x = element_text(angle = 90)) 

Aussming следующие df:

df <- data.frame(
    ISBN = sample(c(3457, 9885), 1000, replace = TRUE), 
    Date = sample(seq(as.Date('2004/01/01'), 
        as.Date('2011/12/31'), by = "month"), 
       1000, replace = TRUE), 
    Quantity = sample(1:12, 1000, replace = TRUE) 
) 

Это будет производить:

enter image description here

+0

Это близко, но есть две проблемы (на моем sisde): 1. «Ранг» доходит до «восьмого года», я думаю, из-за заказа (еще не обнаружил, как group_by «ISBN», order_by " Дата") ; 2. Мне нужно заполнить «Количество» на «Месяц», потому что день слишком подробный для 426 661 записей. Таким образом, мне очень помогло бы, если бы вы предложили способ «группировать», «упорядочивать» по R, а также включать как-то агрегацию (с суммой) в предлагаемое решение. – adlisval

+0

@adlisval Посмотрите обновленную версию –

+0

Мне нужно обновить предыдущий комментарий. Добавление аранжировки (дата)%>%, исправлено 1-е издание с годами. Мне просто нужно выяснить, как это сделать. Во всяком случае, это правильный ответ. Большое спасибо. – adlisval

1

Я бы воспользовался пакетом lubridate для чего-то вроде этого. Примечание. Я обращаюсь к dataframe df, потому что вы не дали ему имени.

Так, например:

library(lubridate) 

Первый формат даты, как так:

df$Date <- ymd(df$Date) 

Затем извлечь месяц и год:

df$Month <- month(df$Date, label=TRUE, abbr=TRUE) 
df$Year <- year(df$Date) 

Оттуда вы можете построить ваш результаты с ggplot2:

library(ggplot2) 
ggplot(df, aes(x=Month, y=Quantity, colour=Year)) + 
geom_point() 

Обратите внимание, что вопрос можно задать здесь лучше, так как вы не представили воспроизводимый пример.

+0

Извините за плохой вопрос, но я еще не знаю, сколько я должен получить в деталях (новичок). Проект более сложный, и я не знал, я хочу вставить все это здесь, просто хотел понять, как это можно сделать. Я попытаюсь изменить вопрос, но идея состоит в том, чтобы иметь ggplot с geom_line в течение 2 лет, ОДИН ПОСЛЕ ДРУГОГО, «Январь-декабрь» за ** 1-й год **, продолжение «Январь-декабрь» за ** 2-й год ** " , а не друг на друга, по цвету по годам. Мне нужно покрасить ISBN и посмотреть на одном участке 24 месяца (1-й, 2-й год), а не 12 месяцев. – adlisval

+0

Хорошо, это должно быть легко. Но вы можете объяснить данные немного больше. У вас есть более двух лет в вашем наборе данных? Нужно ли быть дискретными интервалами в год или перекрываться? Например, вы хотите, чтобы 2012-2013 затем 2013-2014, а затем 2014-2015?Или вы хотите 2012-2013, тогда 2014-2015? – boshek

+0

Извините за поздний ответ. Я также думал, что это должно быть легко ... Я добавил изображение в вопрос, где он точно показывает, как мне нужен сюжет. Как я уже сказал, «идея состоит в том, чтобы нормализовать годы (иметь 1-й, 2-й), но не месяцы», что означает, что не важно год как дата (т.е. 2013 год), а как ** 1-й ** или ** ** вторая. Все предметы являются рекордерами в течение «не более двух лет», как указано в вопросе. – adlisval

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