2017-01-31 3 views
-1

Я не знаком с R, и я немного потерял организацию своих данных. Мой набор данных выглядит следующим образом (TypeOf (mData) список возвращается):Построение нескольких столбцов на одном графике с помощью R

 key_as_string    key  doc_count colA colB   types.buckets 
2017-01-30T13:33:30.000+01:00 1.485780e+12  28  0  0  type1, type2, type3, 18, 5, 5 
2017-01-30T13:34:00.000+01:00 1.485780e+12 175  0  0  type2, type1, type3, type4, 138, 19, 17, 1 
... 

Я хотел бы построить граф с течением времени, то есть, я хотел бы иметь график, где ось х содержит временные метки (как POSIX) и ось y - счетчик с одним цветом для каждого типа (+1 для столбца doc_count). Я нашел много ответов говоря, что я должен расплавить данные, но все примеры использовали простой формат, такие как это (предпочтительно в виде dataframe):

timestamp(as POSIX)    doc_count type1 type2 ... type n 
2017-01-30T13:33:30.000+01:00  28  18  5  ... 
2017-01-30T13:34:00.000+01:00  175  19  138  ... 
... 

Проблема заключается в том, что mData[["types"]][["buckets"]][[x]][[1]] содержит asysmmetric данных, то есть, я не знаете, как порядок и количество типов в строке (порядок не важен для построения графика). Если это так, я хочу добавить 0 в соответствующий столбец.

Как преобразовать mData в форму, аналогичную приведенной выше, и построить ее? Вот где я потерялся.

Вот пример вывода result[["types"]][["buckets"]]:

[[1]] 
      key doc_count 
1  type1  18 
2  type2   5 
3  type3   5 

[[2]] 
      key doc_count 
1  type2  138 
2  type1  19 
3  type3  17 
4  type4   1 

Plotting только общее doc_count в течение долгого времени работает отлично:

dates <- as.POSIXct(mData[["key"]]/1000,origin="1970-01-01") 

# returns NA. Problably because it doesn't match the seconds. How do I parse it correctly? 
#dates <- as.POSIXct(mData[["key_as_string"]],format="%Y-%m-%dT%H:%M:%S+01:00 CET",tz="Europe/Paris") 

mDf <- data.frame(date=dates,doc_count=mData[[3]]) 

ggplot(mDf,aes(date,doc_count))+geom_line(colour=sample(1:255255255, 1))+xlab("")+ylab("Events")+ 
scale_x_datetime(date_breaks="24 hours",date_labels = "%d.%m.%Y %H:%M:%S")+ 
theme(axis.title=element_text(size=24,face="bold"), axis.text.y = element_text(angle=90, hjust=0.5))+geom_area(fill=sample(1:255255255, 1)) 

EDIT:

Это должно repruduce образец моих данных:

structure(list(key_as_string = c("2017-01-30T13:33:30.000+01:00", 
"2017-01-30T13:34:00.000+01:00", "2017-01-30T13:34:30.000+01:00", 
"2017-01-30T13:35:00.000+01:00", "2017-01-30T13:35:30.000+01:00", 
"2017-01-30T13:36:00.000+01:00"), key = c(1485779610000, 1485779640000, 
1485779670000, 1485779700000, 1485779730000, 1485779760000), 
doc_count = c(28L, 175L, 122L, 526L, 160L, 1306L), types = structure(list(
    colA = c(0L, 0L, 0L, 0L, 0L, 0L 
    ), colB = c(0L, 0L, 0L, 0L, 0L, 0L), buckets = list(
     structure(list(key = c("type1", "type2", "type3" 
     ), doc_count = c(18L, 5L, 5L)), .Names = c("key", 
     "doc_count"), class = "data.frame", row.names = c(NA, 
     3L)), structure(list(key = c("type2", "type1", 
     "type3", "type4"), doc_count = c(138L, 19L, 17L, 
     1L)), .Names = c("key", "doc_count"), class = "data.frame", row.names = c(NA, 
     4L)), structure(list(key = c("type2", "type1", 
     "type3"), doc_count = c(60L, 42L, 20L)), .Names = c("key", 
     "doc_count"), class = "data.frame", row.names = c(NA, 
     3L)), structure(list(key = c("type1", "type2", 
     "type3", "type4"), doc_count = c(379L, 128L, 
     18L, 1L)), .Names = c("key", "doc_count"), class = "data.frame", row.names = c(NA, 
     4L)), structure(list(key = c("type2", "type3", 
     "type1"), doc_count = c(87L, 61L, 12L)), .Names = c("key", 
     "doc_count"), class = "data.frame", row.names = c(NA, 
     3L)), structure(list(key = c("type1", "type2", 
     "type3", "type4"), doc_count = c(1139L, 146L, 
     20L, 1L)), .Names = c("key", "doc_count"), class = "data.frame", row.names = c(NA, 
     4L)))), .Names = c("colA", 
"colB", "buckets"), row.names = c(NA, 6L), class = "data.frame")), .Names = c("key_as_string", 
"key", "doc_count", "types"), row.names = c(NA, 6L), class = "data.frame") 
+0

Обеспечить хороший воспроизводимый пример смотрите здесь http://stackoverflow.com/questions/5963269/how-to-make-a-great- r-воспроизводимый пример – Koundy

ответ

0

Здесь я извлекаю гранулированные данные и помещаю их вместе с датой измерения в кадре данных. Вы получите длинный формат данных, который легко построить с ggplot:

library(dplyr) 
library(ggplot2) 

tb <- mData[['types']][['buckets']] 
dt <- mData[['key']] 

pdf <- do.call(rbind,lapply(seq_len(length(tb)), 
          function(x) tb[[x]] %>% mutate(date = dt[x]))) 

ggplot(pdf, aes(x = date, y=doc_count, col=key)) + geom_line() 
+0

Спасибо за быстрый ответ. Работает :) – Ricky