У меня есть список векторов, которые являются временным рядом неравной длины. Моя конечная цель должна вывести временной ряд на печать в a ggplot2
график. Я предполагаю, что я - более обеспеченное первое слияние векторов в кадре данных (где более короткие векторы будут расширены с NAS), также потому что я хочу экспортировать данные в табличном формате, таком как .csv, который будет просмотрен другими людьми.
У меня есть список, который содержит названия всех векторов. Это прекрасно, что заголовки столбцов установлены первым вектором, который является самым длинным. Например:
> mylist
[[1]]
[1] "vector1"
[[2]]
[1] "vector2"
[[3]]
[1] "vector3"
и т.д.
Я знаю, что способ пойти состоит в том, чтобы использовать Hadley plyr
пакет, но я предполагаю, что проблема состоит в том, что мой список содержит названия векторов, не самих векторов, поэтому если я ввожу:
do.call(rbind, mylist)
Я получаю один столбец df содержащий названия DFS, которую я хотел объединить.
> 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"
и т.д.
Даже если я создаю список с объектом самостоятельно, я получаю пустой кадр данных:
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 timeseries? Масштаб является тем же, но я предсказываю, что будет большое сверхграфическое изображение. Так как это - анализ когорты, могло бы быть полезно использовать цвет для выделения различных когорт с точки зрения новизны (как непрерывная переменная). Но как постараться не сверхвыводиться на печать? Различия будут минимальны настолько фасетирующие, мог бы оставить средство просмотра не могущим схватить различие.
Я думаю, что вы можете подходить к этому неправильно:
Если у вас есть временные ряды неравной длины, то самое лучшее, что можно сделать, - это сохранить их как временные ряды и объединить
их. Большинство пакетов временных рядов позволяют это. Таким образом, вы получите многомерный временной ряд, и каждое значение будет правильно связано с одной и той же датой.
Поместите временной ряд в объекты zoo
, объедините
их, а затем используйте функцию my qplot.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")
Если вы делаете это только потому, что ggplot2 (а также многие другие вещи) похожи на фреймы данных, то вам не хватает того, что вам нужно. данные в фреймах данных длинного формата. Да, вы просто объединили все переменные ответа в один столбец. Тогда у вас будет 1 или несколько других столбцов, которые определяют, что отличает эти ответы. Это лучший способ настроить его для таких вещей, как ggplot.
Вы не можете. data.frame ()
должен быть прямоугольным; но правила повторного использования гарантируют, что более короткие векторы будут расширены.
Так что здесь может быть другая ошибка - данные, которые вы хотите rbind
, не подходят? - но трудно сказать, поскольку вы не привели воспроизводимого примера.
Правка Учитывая ваше обновление, вы получаете в точности то, что вы просили: список имен объединяется с помощью rbind
. Если вы хотите, чтобы отображались базовые данные, вам нужно задействовать get ()
или другой метод доступа к данным.