Изменение формы временных рядов с широкоформатного формата (для построения графика) [дубликат]

17

У меня есть кадр данных, содержащий несколько временных рядов возвратов, хранящихся в столбцах.

Первый столбец содержит даты, а последующие столбцы - это независимые временные ряды, каждая из которых имеет имя. Заголовки столбцов являются именами переменных.

## I have a data frame like this
t <- seq(as.Date('2009-01-01'),by='days',length=10)
X <- rnorm(10,0,1)
Y <- rnorm(10,0,2)
Z <- rnorm(10,0,4)

dat <- data.frame(t,X,Y,Z)

## which appears as
           t          X          Y         Z
1 2009-01-01 -1.8763317 -0.1885183 -6.655663
2 2009-01-02 -1.3566227 -2.1851226 -3.863576
3 2009-01-03 -1.3447188  2.4180249 -1.543931

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

Чтобы построить это с помощью решетки, данные должны быть в высоком формате, как таковые:

           t symbol       price
1 2009-01-01      X -1.8763317
2 2009-01-02      Y -0.1885183
2 2009-01-02      Z -6.655663

Что такое хороший вызов функции для этого?     

задан medriscoll 25.07.2009 в 04:50
источник

5 ответов

16

вы также можете использовать melt () из библиотеки «reshape» (я думаю, что это проще в использовании, чем сама reshape ()), что позволит вам добавить дополнительный шаг, чтобы добавить столбец времени обратно ...

> library(reshape)
> m <- melt(dat,id="t",variable_name="symbol")
> names(m) <- sub("value","price",names(m))
> head(m)
           t symbol       price
1 2009-01-01      X -1.14945096
2 2009-01-02      X -0.07619870
3 2009-01-03      X  0.01547395
4 2009-01-04      X -0.31493143
5 2009-01-05      X  1.26985167
6 2009-01-06      X  1.31492397
> class(m$t)
[1] "Date"
> library(lattice)                                                              
> xyplot( price ~ t | symbol, data=m ,type ="l", layout = c(1,3) )
Тем не менее, для этой конкретной задачи я хотел бы использовать библиотеку «zoo», которая не требует, чтобы вы изменили кадр данных:

> library(zoo)                                                                  
> zobj <- zoo(dat[,-1],dat[,1])                                                 
> plot(zobj,col=rainbow(ncol(zobj))) 

R разработчиков / вкладчиков (Габор и Хэдли в этом случае) благословили нас множеством отличных решений. (и не может забыть Deepayan для пакета решетки)

    
ответ дан hatmatrix 28.07.2009 в 08:29
источник
  • Melt - именно то, что я искал. Стивен, не могли бы вы отредактировать свой ответ, чтобы включить последний шаг построения? –  medriscoll 30.07.2009 в 06:21
  • Впустую час с функцией «stats :: reshape ()», мне нужно задаться вопросом, какие лекарства принимали некоторые люди, которые писали R-функции. расплав () велик. (еще раз, спасибо Хэдли) –  forkandwait 22.10.2009 в 21:46
12

Из страницы сбора tidyr :

<сильные> Примеры

library(tidyr)
library(dplyr)
# From http://stackoverflow.com/questions/1181060
stocks <- data.frame(
  time = as.Date('2009-01-01') + 0:9,
  X = rnorm(10, 0, 1),
  Y = rnorm(10, 0, 2),
  Z = rnorm(10, 0, 4)
)

gather(stocks, stock, price, -time)
stocks %>% gather(stock, price, -time)
    
ответ дан zx8754 08.10.2014 в 12:13
источник
  • Хммм ... интересно. Похоже, что страница сбора данных tidyr рекурсивно ссылается на этот вопрос и этот ответ. –  running.t 26.07.2015 в 22:28
9

Если это многомерный временной ряд, попробуйте сохранить его как объект зоопарка, используя пакет с таким же именем. Это упрощает индексирование, слияние, подсечение - см. Виньетки в зоопарке.

Но как вы спрашивали о решетчатых сюжетах - и это тоже можно сделать. В этом примере мы строим простой «длинный» data.frame с столбцом даты, а также столбец значений «val» и столбец идентификатора переменной «var»:

> set.seed(42)
> D <- data.frame(date=rep(seq(as.Date("2009-01-01"),Sys.Date(),by="week"),2),\
                  val=c(cumsum(rnorm(30)), cumsum(rnorm(30))), \
                  var=c(rep("x1",30), rep("x2",30)))

Учитывая этот набор данных, построение графика для вашего описания выполняется с помощью xyplot из пакета решетки, запрашивая график «данные, данные сгруппированные по переменной», где мы включаем строки в каждой панели:

> library(lattice)
> xyplot(val ~ date | var, data=D, panel=panel.lines)
    
ответ дан Dirk Eddelbuettel 25.07.2009 в 05:07
источник
3

Для фрейма данных temp с датой в первом столбце и значениями в каждом из других столбцов:

> par(mfrow=c(3,4)) # 3x4 grid of plots
> mapply(plot,temp[,-1],main=names(temp)[-1],MoreArgs=list(x=temp[,1],xlab="Date",type="l",ylab="Value") )
    
ответ дан MRE 25.07.2009 в 05:18
источник
2

Большое спасибо за ответы ребятам - ответ Дирка был отмечен.

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

Итак, вот что я в итоге сделал, используя «dat» dataframe, упомянутый в вопросе:

## use stack() to reshape the data frame to a long format
## <time> <stock> <price>
stackdat <- stack(dat,select=-t) 
names(stackdat) <- c('price','symbol')

## create a column of date & bind to the new data frame
nsymbol <- length(levels(stackdat$symbol))  
date <- rep(dat$t, nsymbol)  
newdat <- cbind(date,stackdat)

## plot it with lattice
library(lattice)
xyplot(price ~ date | symbol,  ## model conditions on 'symbol' to lattice
       data=newdat,            ## data source
       type='l',               ## line
       layout=c(nsymbol,1))    ## put it on a single line

## or plot it with ggplot2
library(ggplot2)
qplot(date, price, data = newdat, geom="line") + facet_grid(. ~ symbol)
    
ответ дан medriscoll 26.07.2009 в 00:51
источник
  • См. также расплав из пакета reshape для конвертирования от широкого к длинному. –  hadley 26.07.2009 в 16:12