2010-07-29 2 views
10

У меня есть список векторов, которые являются временными рядами неравной длины. Моя конечная цель - построить временные ряды в графике ggplot2. Я предполагаю, что лучше сперва слияние векторов в фрейме данных (где более короткие векторы будут расширены с помощью NA), также потому, что я хочу экспортировать данные в табличном формате, например .csv, чтобы их просматривали другие люди.Объединение векторов неравной длины в кадр данных

У меня есть список, который содержит имена все векторы. Хорошо, что заголовки столбцов задаются первым вектором, который является самым длинным. Например:

> mylist 
[[1]] 
[1] "vector1" 

[[2]] 
[1] "vector2" 

[[3]] 
[1] "vector3" 

т.д.

Я знаю, что путь заключается в использовании plyr пакета Хэдли, но я думаю, проблема в том, что мой список содержит имена векторов, а не сами векторы, так что если Я тип:

do.call(rbind, mylist) 

я получаю одну колонки ФР вмещающих имена ДФСА я хотел слиться.

> do.call(rbind, actives) 
     [,1]   
[1,] "vector1" 
[2,] "vector2" 
[3,] "vector3" 
[4,] "vector4" 
[5,] "vector5" 
[6,] "vector6" 
[7,] "vector7" 
[8,] "vector8" 
[9,] "vector9" 
[10,] "vector10" 

т.д.

Даже если создать список с самим объектом, я получаю пустой dataframe:

mylist <- list(vector1, vector2) 
mylist 
[[1]] 
     1   2   3   4   5   6   7   8   9  10  11  12 
0.1875000 0.2954545 0.3295455 0.2840909 0.3011364 0.3863636 0.3863636 0.3295455 0.2954545 0.3295455 0.3238636 0.2443182 
     13  14  15  16  17  18  19  20  21  22  23  24 
0.2386364 0.2386364 0.3238636 0.2784091 0.3181818 0.3238636 0.3693182 0.3579545 0.2954545 0.3125000 0.3068182 0.3125000 
     25  26  27  28  29  30  31  32  33  34  35  36 
0.2727273 0.2897727 0.2897727 0.2727273 0.2840909 0.3352273 0.3181818 0.3181818 0.3409091 0.3465909 0.3238636 0.3125000 
     37  38  39  40  41  42  43  44  45  46  47  48 
0.3125000 0.3068182 0.2897727 0.2727273 0.2840909 0.3011364 0.3181818 0.2329545 0.3068182 0.2386364 0.2556818 0.2215909 
     49  50  51  52  53  54  55  56  57  58  59  60 
0.2784091 0.2784091 0.2613636 0.2329545 0.2443182 0.2727273 0.2784091 0.2727273 0.2556818 0.2500000 0.2159091 0.2329545 
     61 
0.2556818 

[[2]] 
     1   2   3   4   5   6   7   8   9  10  11  12 
0.2824427 0.3664122 0.3053435 0.3091603 0.3435115 0.3244275 0.3320611 0.3129771 0.3091603 0.3129771 0.2519084 0.2557252 
     13  14  15  16  17  18  19  20  21  22  23  24 
0.2595420 0.2671756 0.2748092 0.2633588 0.2862595 0.3549618 0.2786260 0.2633588 0.2938931 0.2900763 0.2480916 0.2748092 
     25  26  27  28  29  30  31  32  33  34  35  36 
0.2786260 0.2862595 0.2862595 0.2709924 0.2748092 0.3396947 0.2977099 0.2977099 0.2824427 0.3053435 0.3129771 0.2977099 
     37  38  39  40  41  42  43  44  45  46  47  48 
0.3320611 0.3053435 0.2709924 0.2671756 0.2786260 0.3015267 0.2824427 0.2786260 0.2595420 0.2595420 0.2442748 0.2099237 
     49  50  51  52  53  54  55  56  57  58  59  60 
0.2022901 0.2251908 0.2099237 0.2213740 0.2213740 0.2480916 0.2366412 0.2251908 0.2442748 0.2022901 0.1793893 0.2022901 

но

do.call(rbind.fill, mylist) 
data frame with 0 columns and 0 rows 

Я пытался преобразуя векторов к кадрам данных, но функция cbind.fill отсутствует, поэтому plyr жалуется, что данные е разной длины.

Так что мои вопросы:

  • Является ли это лучший подход? Имейте в виду, что целью является a) график ggplot2 и b) таблица с временным рядом, которая должна быть просмотрена за пределами R

  • Что является лучшим способом получить список объектов, начиная со списка имена этих объектов?

  • Каков наилучший тип графика, чтобы выделить шаблоны из 60 времен? Масштаб такой же, но я предсказываю, что будет много перепланирования. Поскольку это когортный анализ, было бы полезно использовать цвет, чтобы выделить различные когорты в терминах рекурсии (как непрерывной переменной). Но как избежать перепланирования? Различия будут минимальными, поэтому украшение может оставить зрителя неспособным понять разницу.

+1

Вы не можете этого сделать. Stick со списками, поскольку они могут обрабатывать векторы переменной длины. Тем не менее, я не понимаю, чего вы хотите достичь ... – aL3xa

+0

Я отредактировал вопрос, дающий больше контекста. Прошу прощения за путаницу. – Roberto

+0

Из ваших вопросов третий вопрос будет более правильно задан здесь: http://stats.stackexchange.com/ – Shane

ответ

10

Я думаю, что вы, возможно, приближается это неправильный путь:

Если у вас есть временные ряды разной длины, то самое лучшее, что нужно сделать, это держать их в качестве временных рядов и merge им. Большинство пакетов временных рядов позволяют это. Таким образом, вы получите многовариантный временной ряд, и каждое значение будет правильно связано с той же датой.

Итак, поставьте свои временные ряды на zoo объекты, merge их, затем используйте my qplot.zoo function, чтобы построить их. Это будет связано с переключением с zoo на длинный фрейм данных.

Вот пример:

> z1 <- zoo(1:8, 1:8) 
> z2 <- zoo(2:8, 2:8) 
> z3 <- zoo(4:8, 4:8) 
> nm <- list("z1", "z2", "z3") 
> z <- zoo() 
> for(i in 1:length(nm)) z <- merge(z, get(nm[[i]])) 
> names(z) <- unlist(nm) 
> z 
    z1 z2 z3 
1 1 NA NA 
2 2 2 NA 
3 3 3 NA 
4 4 4 4 
5 5 5 5 
6 6 6 6 
7 7 7 7 
8 8 8 8 
> 
> x.df <- data.frame(dates=index(x), coredata(x)) 
> x.df <- melt(x.df, id="dates", variable="val") 
> ggplot(na.omit(x.df), aes(x=dates, y=value, group=val, colour=val)) + geom_line() + opts(legend.position = "none") 
+0

Шейн: спасибо за предоставление альтернативного подхода. Что такое sytax для объединения объекта, когда у меня есть список со всеми их именами? – Roberto

+0

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

0

Вы не можете. A data.frame() должен быть прямоугольным; но правила утилизации гарантируют, что более короткие векторы будут расширены.

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

Редактировать Учитывая ваши обновления, вы получите именно то, что вы просили: список имен получает комбинируются rbind. Если вы хотите, чтобы основные данные отображались, вам необходимо включить get() или другой аксессуар данных.

+0

Я отредактировал вопрос с указанием моей цели и примерами – Roberto

3

Если вы делаете это только потому, что ggplot2 (как и многое другое), как кадры данных, то, что вам не хватает в том, что вам нужны данные в длинном формате кадры данных. Да, вы просто поместили все свои переменные ответа в один столбец, объединенный вместе. Тогда у вас будет 1 или несколько других столбцов, которые идентифицируют, что отличает эти ответы. Это лучший способ настроить его для таких вещей, как ggplot.

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