2016-09-15 9 views
1

Я создаю блестящее приложение, которое будет иметь checkboxGroupInput, где каждый проверенный флажок добавит еще одну строку к частотной диаграмме. Я пытаюсь обернуть голову вокруг reshape2 и ggplot2, чтобы понять, как это сделать.Интерактивное построение нескольких строк с блестящими и ggplot2

данные:

head(testSet) 
    date store_id product_id count 
1 2015-08-15  3  1  8 
2 2015-08-15  3  3  1 
3 2015-08-17  3  1  7 
4 2015-08-17  3  2  3 
5 2015-08-17  3  3  1 
6 2015-08-18  3  3  2 

класс информации Уровень:

dput(droplevels(head(testSet, 10))) 
structure(list(date = structure(c(16662, 16662, 16664, 
16664, 16664, 16665, 16665, 16665, 16666, 16666), class = "Date"), 
    store_id = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), product_id = c(1L, 
    3L, 1L, 2L, 3L, 3L, 1L, 2L, 1L, 2L), count = c(8L, 1L, 7L, 
    3L, 1L, 2L, 18L, 1L, 0L, 2L)), .Names = c("date", "store_id", 
"product_id", "count"), row.names = c(NA, 10L), class = "data.frame") 

График должен иметь ось х, что соответствует date, а у-оси, которая соответствует count. Я хотел бы иметь вход группы флажков, где для каждого поля, представляющего продукт, проверяется, строка, соответствующая product_id, будет нанесена на график. Данные уже отфильтрованы до store_id.

Моя первая мысль заключалась в том, чтобы написать цикл for внутри участка для визуализации нового geom_line() за каждое возвращаемое значение вектора input$productId. - однако после некоторых исследований кажется, что это неправильный путь.

В настоящее время я пытаюсь до melt() данных к чему-то полезному, а затем aes(...group=product_id), но получаю ошибки на все, что я пытаюсь.

Попытка расплавить данные:

meltSet <- melt(testSet, id.vars="product_id", value.name="count", variable.name="date") 

глава meltSet

head(meltSet) 
    product_id date count 
1  1 date 16662 
2  3 date 16662 
3  1 date 16664 
4  2 date 16664 
5  3 date 16664 
6  3 date 16665 

хвост meltSet

tail(meltSet) 
    product_id date count 
76  9  count  5 
77  1  count 19 
78  2  count  1 
79  3  count 39 
80  8  count  1 
81  9  count  4 

Черчение:

ggplot(data=meltSet, aes(x=date, y=count, group = product_id, colour = product_id)) + geom_line() 

enter image description here

Таким образом, моя ось и значения все в порядке, а не то, что я ожидаю от настройки сюжета.

+0

'melt' - правильная идея. Очень сложно понять, что вы делаете неправильно, когда не показываете свой код или даже текст ошибок! Пожалуйста, отредактируйте, чтобы точно указать код, который вы используете для 'melt()', возможно, 'head()' из расплавленного фрейма данных и (простая) версия вашего кода 'ggplot', а также полный текст любого ошибки, которые вы получаете. Также было бы неплохо, если бы вы поделились своими исходными данными с помощью 'dput()' например, 'dput (droplevels (head (testSet, 10))), так что информация о классе столбцов также будет разделяться. Это будет иметь значение, если вы используете факторы или даты, цифры или символы. – Gregor

+0

Я удалил связанные с блистающими тегами теги - кажется, что это блестящая цель, но это всего лишь промежуточный шаг. Тот факт, что это окажется в блестящем приложении, кажется тангенциальным. – Gregor

+0

Спасибо @Gregor, я обновил вопрос с помощью моей последней попытки. Будем держаться за это, я уверен, что я просто не расплавляю свои данные должным образом. – huxfurpaw

ответ

1

Если я правильно понимаю, вам не нужно плавить, вам просто нужно заполнить свои данные, суммируя подсчет по дате и product_id. Вы можете использовать data.table для этой цели:

testSet = data.table(testSet) 
aggrSet = testSet[, .(count=sum(count)), by=.(date, product_id)] 

Вы можете сделать свой ggplot материал на aggrSet. Теперь он состоит из трех столбцов: date, product_id, count.

Когда вы таете, как и вы, вы объединяете две переменные с разными типами в дату: дату (дата) и store_id (int).