我有一个矢量列表,它们是不等长度的时间序列.我的最终目标是在图表中绘制时间序列ggplot2
.我想我最好首先合并数据帧中的向量(其中较短的向量将使用NA扩展),这也是因为我想以表格格式(例如.csv)导出数据以供其他人阅读.
我有一个包含所有向量名称的列表.列标题可以由第一个向量设置,这是最长的.例如:
> mylist
[[1]]
[1] "vector1"
[[2]]
[1] "vector2"
[[3]]
[1] "vector3"
Run Code Online (Sandbox Code Playgroud)
等等
我知道要走的路是使用Hadley的plyr
包但我想问题是我的列表包含向量的名称,而不是向量本身,所以如果我输入:
do.call(rbind, mylist)
Run Code Online (Sandbox Code Playgroud)
我得到一个包含我想要合并的dfs名称的单列df.
> 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"
Run Code Online (Sandbox Code Playgroud)
等等
即使我自己创建了一个包含对象的列表,我也会获得一个空的数据帧:
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
Run Code Online (Sandbox Code Playgroud)
但
do.call(rbind.fill, mylist)
data frame with 0 columns and 0 rows
Run Code Online (Sandbox Code Playgroud)
我已经尝试将向量转换为数据帧,但是没有cbind.fill
函数,所以plyr抱怨数据帧的长度不同.
所以我的问题是:
这是最好的方法吗?请记住,目标是a)ggplot2图表和b)具有时间序列的表格,可在R外部查看
获取以这些对象的名称列表开头的对象列表的最佳方法是什么?
什么是突出60个时间序列模式的最佳图形类型?规模是相同的,但我预测会有很多过度绘图.由于这是一个队列分析,因此使用颜色突出显示新近度(作为连续变量)的不同群组可能是有用的.但是如何避免过度绘图呢?差异将是最小的,因此分面可能使观众无法掌握差异.
Sha*_*ane 11
我认为你可能会以错误的方式接近这个:
如果你有不等长度的时间序列,那么最好的办法是将它们作为时间序列和merge
它们保持一致.大多数时间序列包允许这样做.因此,您最终会得到一个多变量的时间序列,并且每个值都将与相同的日期正确关联.
所以把时间序列放到zoo
对象中merge
,然后使用我的qplot.zoo
函数绘制它们.这将涉及从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")
Run Code Online (Sandbox Code Playgroud)