将不等长的矢量组合成数据帧

Rob*_*rto 11 r

我有一个矢量列表,它们是不等长度的时间序列.我的最终目标是在图表中绘制时间序列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)